如何使用nodejs child_process.spawn捕获ENOENT



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

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

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

但这只是在节点事件循环中的某个地方引发了一个uncaughtException,可能是因为调用是异步的,甚至没有尝试在脚本的时间片上启动子进程。

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


相似但不同:如何调试";错误:生成ENOENT";在node.js上?

我清楚地知道我为什么会得到ENOENT,我知道该改变什么才能避免错误的发生。我的问题是,如果错误不可避免,如何优雅地应对这种情况。

与节点中的许多事情一样,子进程可以发出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);
});

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新