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.


Reply via email to