Node.js 如何使用nodejs child_process.spawn捕获eNONT?

Node.js 如何使用nodejs child_process.spawn捕获eNONT?,node.js,child-process,Node.js,Child Process,我正在使用spawn生成一个长时间运行的进程,该进程将输出随时间发送到stdio,并由我的nodejs脚本读取和处理。棘手的是,我不能保证发送的命令总是有效的。如何捕获产卵过程中的错误?最好不要安装全局异常处理程序,因为我不想处理任何其他异常。(如果这是唯一的方法,我需要确定生成的进程何时正确启动,然后卸载处理程序,这是一个我不想陷入的混乱局面。) 我要运行的代码如下所示: var spawn = require('child_process').spawn; try { spawn(

我正在使用
spawn
生成一个长时间运行的进程,该进程将输出随时间发送到stdio,并由我的nodejs脚本读取和处理。棘手的是,我不能保证发送的命令总是有效的。如何捕获产卵过程中的错误?最好不要安装全局异常处理程序,因为我不想处理任何其他异常。(如果这是唯一的方法,我需要确定生成的进程何时正确启动,然后卸载处理程序,这是一个我不想陷入的混乱局面。)

我要运行的代码如下所示:

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

try {
    spawn("zargle");
} catch (e) {
    console.error("I'm handling the error!");
}
但这只是在节点事件循环的某个地方引发了一个uncaughtException,可能是因为调用是异步的,甚至没有尝试在脚本的时间片上启动子进程

唯一需要捕获的异常是当spawn无法启动进程时(例如,名称不正确并且抛出enoint)。我(此时)并不关心衍生过程本身可能产生的任何问题


相似但不同:


我清楚地知道为什么我会变得如此愚蠢,我也知道应该做些什么来避免错误的发生。我的问题是,如果错误不可避免,如何优雅地应对这种情况。

与节点中的许多事情一样,子进程可以发出错误。为此添加一个侦听器,您将能够捕获它(无需
try-catch
needed):


您可以尝试用processuncaughtexception事件捕获它。 但我相信剩下的任务并不容易

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

正如mscdex所说,您必须附加“error”事件,但是,您应该添加try-catch,因为一些错误,如EPERM不会触发错误事件并引发错误异常

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)
}

所以你完全正确。我甚至从未尝试过这种方法,因为我没有想到spawn会有选择地抛出异常,这取决于是否附加了错误处理程序。(如果文档会提到这样的事情来帮助我们节点新手,那就太好了。)FWIW
error
事件一直是一个特殊事件,因为如果没有
error
事件侦听器(并且
进程上没有
uncaughtException
事件处理程序),当它发出时,就会抛出错误。关于节点文档中的错误有一个专门的部分。我只是尝试了一下,但没有成功。如果spawn尝试运行一个不存在的文件,这是否有效?如果添加事件处理程序对您不起作用,您应该发布一个新问题。我刚刚复制了您的控制台消息。我的代码现在可以发布了;)你能举例说明你的意思吗?你的答案似乎模棱两可,我不知道我是否需要进一步调查。我同意,这不清楚,我更新了我的答案,希望它更清楚。
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)
}