web-dev-qa-db-ja.com

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を発生させるだけです。これは、おそらく呼び出しが非同期であり、スクリプトのタイムスライスで子プロセスを開始しようとしていないためです。

キャッチする必要のある唯一の例外は、spawnがプロセスをまったく開始できない場合です(たとえば、名前が正しくなく、ENOENTがスローされます)。現時点では、生成されたプロセスが独自に生成する可能性のある問題については心配していません。


類似しているが異なる: node.jsで「エラー:spawn ENOENT」をデバッグするにはどうすればよいですか?

私はENOENTを取得している理由を正確に知っており、エラーが発生しないようにするには何を変更すればよいかを知っています。私の質問は、エラーが避けられない場合に、この状況に適切に対応する方法です。

12
Fizzbuzz97

ノード内の多くのものと同様に、子プロセスは error event を発行できます。そのリスナーを追加すると、それをキャッチできるようになります(try-catchは不要)。

var spawn = require('child_process').spawn;
var child = spawn('foo');
child.on('error', function(err) {
  console.log('Oh noez, teh errurz: ' + err);
});
28
mscdex

Mscdexが言ったように、 'error'イベントをアタッチする必要がありますが、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)
}
5
c-toesca

プロセスのuncaughtExceptionイベントでそれをキャッチしようとすることができます。しかし、残りの作業は簡単ではないと思います。

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