Yes, emit errors instead of throwing them. If there's no error listener attached, EventEmitter is special-cased to throw when errors are encountered. That plus a domain used by the developer consuming the stream (with the stream optionally added to the domain, if it's only going to be used with a single domain) will make sure that the error gets routed to where it needs to go.
F On Mon, Jun 17, 2013 at 6:46 PM, Ryan Schmidt <[email protected]>wrote: > Thanks! I hadn't thought of using setImmediate. > > That means my transform stream constructor would become a single call to > setImmediate, which would then do all the work. Because it's not errors > from `spawn` so much as it's errors I'd like to emit from the constructor > in response to incorrect parameters before I even call `spawn`. > > It sounds like you would say that in a stream I should emit errors, never > throw them? > > > On Jun 17, 2013, at 20:35, Dan Milon wrote: > > > You can wrap `spawn` in a `setImmediate`, so that others get a chance to > > attach their events. > > > > On 06/18/2013 04:19 AM, Ryan Schmidt wrote: > >> Per previous threads, I'm implementing a transform stream around a > particular command line program for use in a web service. How should the > stream report errors? > >> > >> In the case of the _transform and _flush functions that I'm supposed to > implement, they're given a callback parameter, so I can "callback(new > Error(…))". That's easy, but what about in other situations, like the > constructor? > >> > >> In the constructor of my custom transform stream, I spawn a process: > >> > >> var process = this._process = spawn(options.command, options.args, > options.env); > >> > >> If the process closes with a non-zero exit code or crashes, I want to > be able to report that, not just to the server's console, but also to the > web browser of the user who made the request that started the process: > >> > >> process.on('close', function(code, signal) { > >> if (signal !== null) { > >> … > >> } else if (code !== 0) { > >> … > >> } > >> self.emit('close'); > >> }); > >> > >> If a problem occurred, should I "throw new Error(…)" or > "self.emit('error', new Error(…)"? > >> > >> I was emitting the error, but am having trouble making that work in > code running directly in the constructor. Let's say I want to allow only a > few different commands ("foo" and "bar") to be run: > >> > >> if (!~['foo', 'bar'].indexOf(options.command)) { > >> this.emit('error', new Error('Invalid command: ' + options.command)); > >> } > >> > >> If I emit an error like that, then the node program exits saying there > was no listener attached to the stream listening for the error event. But I > cannot attach a listener to the stream until after the constructor has > finished and has returned the stream object to me. > >> > >> Should I instead throw the error? If so, do I just use a try{}catch{} > block whenever I create such a stream? > >> > >> > >> Passing Error objects to a callback is straightforward, but other > methods of error handling in node are still very confusing to me, > especially try/catch. Guidance would be appreciated. > >> > >> > > > > -- > -- > Job Board: http://jobs.nodejs.org/ > Posting guidelines: > https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines > You received this message because you are subscribed to the Google > Groups "nodejs" group. > To post to this group, send email to [email protected] > To unsubscribe from this group, send email to > [email protected] > For more options, visit this group at > http://groups.google.com/group/nodejs?hl=en?hl=en > > --- > You received this message because you are subscribed to the Google Groups > "nodejs" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/groups/opt_out. > > > -- -- Job Board: http://jobs.nodejs.org/ Posting guidelines: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines You received this message because you are subscribed to the Google Groups "nodejs" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/nodejs?hl=en?hl=en --- You received this message because you are subscribed to the Google Groups "nodejs" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/groups/opt_out.
