Node.js – How to catch an ENOENT with nodejs child_process.spawn

child-processnode.js

I am using spawn to spawn a long running process that sends output over time to stdio, and is read and processed by my nodejs script. The tricky part is that I cannot guarantee that the command sent will always be valid. How can I catch an error in spawning? Preferably this will not involve installing a global exception handler, since I don't want to handle any other exceptions. (If that's the only way, I would need to figure out when the spawned process has started up correctly and then uninstall the handler, which is a mess I'd rather not get into.)

The code I want to run would be something like this:

var spawn = require('child_process').spawn;

try {
    spawn("zargle");
} catch (e) {
    console.error("I'm handling the error!");
}

But this just raises an uncaughtException somewhere in the node event loop, presumably because the call is async and didn't even try to start the child process on my script's time slice.

The only exceptions that need to be caught are when spawn fails to start the process at all (for example, the name is incorrect and ENOENT is thrown). I am not (at this time) concerned with any problems the spawned process might generate on its own.


Similar but different: How do I debug "Error: spawn ENOENT" on node.js?

I know exactly why I am getting ENOENT, and I know what to change to have the error not happen. My question is how to gracefully respond to this situation if the error is unavoidable.

Best Answer

As with many things in node, child processes can emit an error event. Add a listener for that and you will be able to catch it (no try-catch needed):

var spawn = require('child_process').spawn;
var child = spawn('foo');
child.on('error', function(err) {
  console.log('Oh noez, teh errurz: ' + err);
});