Vm2: 非同期コールバックのエラーを処理する

作成日 2017年02月03日  ·  8コメント  ·  ソース: patriksimek/vm2

非同期コールバックのエラーを処理する方法はありますか?

const {NodeVM} = require('vm2');

const vm = new NodeVM({
    timeout: 10000,
    sandbox: {}
});

try {
  vm.run(`
    setInterval(() => {
      console.log("haha")
      process.exit()              // <--- can't find a way to intercept this!
    }, 1000);

    process.exit()
  `, 'code.js');
} catch(e) {
  console.log(e.message);
}


setInterval(() => {
  console.log("haha 2")
},1000);

スクリプト全体がクラッシュするのを防ぐ方法を探しています。

feature request stale

最も参考になるコメント

vm.run()をdomain.run()でラップしていますが、機能しているようです。 副作用があるかどうかはわかりませんが。

let domain = Domain.create();
domain.on('error', (err) => {
    console.error('Asynchronous error while executing script.', err.stack);
});
domain.run(() => {
    try {
        vm.run(script, filename);
    } catch (err) {
        console.error('Synchronous error while executing script.', err.stack);
    }
});

全てのコメント8件

次のような非同期エラーを処理できます。

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

これにより、VMの内部と外部の両方からすべての例外がキャッチされることに注意してください。

THX。 はい、それは部分的に私を助けました。 ところで、「uncaughtException」のエラーがVM(およびおそらくそれらのどれ)に関連しているかどうかを区別する方法はありますか?

残念ながら、現時点ではありません。 これをどのように実装するかはわかりますが、少し時間がかかります。

vm.run()をdomain.run()でラップしていますが、機能しているようです。 副作用があるかどうかはわかりませんが。

let domain = Domain.create();
domain.on('error', (err) => {
    console.error('Asynchronous error while executing script.', err.stack);
});
domain.run(() => {
    try {
        vm.run(script, filename);
    } catch (err) {
        console.error('Synchronous error while executing script.', err.stack);
    }
});

この問題は、最近のアクティビティがないため、自動的に古いものとしてマークされています。 それ以上のアクティビティが発生しない場合は閉じられます。 貢献していただきありがとうございます。

@alstergこの方法は効果を失っているようです。

@patriksimekこれを忘れたら教えてください。

@ImSingeeを確認
非同期エラーの処理方法に関する更新はありますか?

これに関する更新はありますか?

このページは役に立ちましたか?
0 / 5 - 0 評価