Как поймать 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);
});