Как поймать ENOENT с дочерним процессом nodejs.Спаун?

Я использую spawn для создания длительного процесса, который со временем отправляет выходные данные в stdio и читается и обрабатывается моим скриптом nodejs. Хитрая часть заключается в том, что я не могу гарантировать, что отправленная команда всегда будет действительной. Как я могу поймать ошибку в нересте? Предпочтительно это не будет включать установку глобального обработчика исключений, так как я не хочу обрабатывать любые другие исключения. (Если это единственный способ, мне нужно будет выяснить, когда начался порожденный процесс правильно, а затем удалите обработчик,в который я бы не хотел попасть.)

код, который я хочу запустить, будет примерно таким:

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

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

но это просто вызывает uncaughtException где-то в цикле событий узла, предположительно потому, что вызов асинхронен и даже не пытался запустить дочерний процесс на временном срезе моего скрипта.

единственные исключения, которые необходимо поймать, - это когда spawn не запускает процесс вообще (например, имя неверно и выбрасывается ENOENT). Я не (в настоящее время) обеспокоен какими-либо проблемами, которые порожденный процесс может генерировать сам по себе.


похожие, но разные: как отлаживать "Error: spawn ENOENT"на узле.Яш?

Я точно знаю, почему я получаю ENOENT, и я знаю, что изменить, чтобы ошибка не произошла. Мой вопрос в том, как изящно реагировать на эту ситуацию, если ошибка неизбежна.

3 ответов


как и многие вещи в узле, дочерние процессы могут испускать 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, вы должны прикрепить событие "ошибка", однако,вы должны добавить 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)
}

вы можете попытаться поймать его с событием process uncaughtException. Но я считаю, что остальная часть задачи будет нелегкой.

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