Могу ли я поймать ошибку из асинхронного без использования await?
Могут ли ошибки от неожиданного асинхронного вызова быть перехвачены, отправлены в исходную инкапсулирующую команду try / catch или вызвать необработанное исключение?
Вот пример того, что я имею в виду:
async function fn1() {
console.log('executing fn1');
}
async function fn2() {
console.log('executing fn2');
throw new Error('from fn2');
}
async function test() {
try {
await fn1();
fn2();
}
catch(e) {
console.log('caught error inside test:', e);
}
}
test();
В этом случае ошибка выдается изfn2
будет тихо проглочен и точно не пойман оригиналомtry/catch
, Я считаю, что это ожидаемое поведение, так какfn2
Скорее всего, будет перенесен в цикл событий, чтобы закончить в какой-то момент в будущем, иtest
не волнует, когда это заканчивается (что является преднамеренным).
Есть ли способ гарантировать, что ошибки не будут случайно поглощены такой структурой, кроме как поставитьtry/catch
внутренний кfn2
и делать что-то вроде выдачи ошибки? Я бы даже согласился на необработанную ошибку, не зная, как ее перехватить, я думаю - я не ожидаю, что сгенерированные ошибки будут типичным потоком программы с тем, что я пишу, но проглатывание ошибок делает его относительно раздражающим для отладки.
Примечание: я использую Babel для переноса кода, используя преобразование babel-runtime, и выполняю его с помощью узла.