非同期コールバックのエラーを処理する方法はありますか?
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);
スクリプト全体がクラッシュするのを防ぐ方法を探しています。
次のような非同期エラーを処理できます。
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を確認
非同期エラーの処理方法に関する更新はありますか?
これに関する更新はありますか?
最も参考になるコメント
vm.run()をdomain.run()でラップしていますが、機能しているようです。 副作用があるかどうかはわかりませんが。