如何用nodejs child_process.spawn捕获ENOENT?

我正在使用spawn来产生一个长时间运行的过程,这个过程随着时间的推移将输出发送到stdio,并由我的nodejs脚本读取和处理。 棘手的部分是,我不能保证发送的命令总是有效的。 我怎样才能捕捉到产卵错误? 最好不涉及安装一个全局exception处理程序,因为我不想处理任何其他exception。 (如果这是唯一的方法,我将需要弄清楚什么时候产生的进程已经正确启动,然后卸载处理程序,这是一个混乱,我不想进入。)

我想要运行的代码是这样的:

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

但是这只是在节点事件循环的某个地方引发了一个uncaughtExceptionexception,大概是因为这个调用是asynchronous的,甚至没有尝试在我的脚本的时间片上启动subprocess。

只有当spawn根本无法启动进程(例如,名称不正确,引发ENOENT)时,才需要捕获的唯一例外情况。 我不(现在)关心产生的过程可能产生的任何问题。


类似但不同: 如何在node.js上debugging“错误:产生ENOENT”?

我确切地知道为什么我会得到ENOENT,而且我知道该怎么改变才能使错误没有发生。 我的问题是,如果错误是不可避免的,如何正确地回应这种情况。

与节点中的许多事情一样,subprocess可以发出error事件 。 添加一个监听器,你将能够捕捉到它(不需要try-catch ):

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

您可以尝试用stream程uncaughtException事件来捕获它。 但是我相信其余的任务并不容易。

 process.on('uncaughtException', function (err) { console.log(err); }); 

就像mscdex所说的那样,你必须附加'error'事件,但是你应该添加try catch,因为一些错误,比如EPERM不会触发错误事件并抛出Errorexception。

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