当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用nodejschild_process.spawn捕获ENOENT?》经验,为你挑选了2个好方法。

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

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

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

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

但这只会在节点事件循环中的某处产生一个uncaughtException,大概是因为调用是异步的,甚至没有尝试在我的脚本的时间片上启动子进程.

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


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

我确切地知道为什么我会获得ENOENT,而且我知道要改变什么以避免错误发生.我的问题是如果错误是不可避免的,如何优雅地回应这种情况.



1> mscdex..:

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


我刚刚复制了你的控制台消息.我的代码现在可以发货;)

2> c-toesca..:

就像mscdex所说的那样,您必须附加“错误”事件,但是,您应该添加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)
}

推荐阅读
360691894_8a5c48
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有