一尘不染

如何使用nodejs child_process.spawn捕获ENOENT?

node.js

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

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

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

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

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

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


我确切地知道为什么我会得到ENOENT,并且我知道要进行更改以使错误不会发生。我的问题是,如果错误不可避免,该如何应对这种情况。


阅读 376

收藏
2020-07-07

共1个答案

一尘不染

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