Есть ли способ обработать ошибку в асинхронном обратном вызове?
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);
})
Имейте в виду, что это перехватывает все исключения как внутри, так и за пределами виртуальной машины.
Спасибо. Да, частично мне это помогло. Кстати, есть ли способ определить, связана ли ошибка в uncaughtException с виртуальной машиной (и, возможно, с какой из них) или нет?
К сожалению, пока нет. У меня есть идея, как это реализовать, но это займет некоторое время.
Я оборачиваю 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 (), и, похоже, он работает. Я не знаю, есть ли у него какие-либо побочные эффекты ..