Могут ли быть обнаружены ошибки от не ожидаемого асинхронного вызова, отправлены в исходный инкапсулирующий 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
try/catch
и сделать что-то вроде испускания ошибки? Я бы даже согласился на непродуманную ошибку, не зная, как ее поймать, я думаю - я не ожидаю, что брошенные ошибки станут типичным потоком программы с тем, что я пишу, но проглатывание ошибок делает его относительно раздражающим для отладки.
Боковое замечание, я использую Babel для перевода кода с использованием преобразования babel-runtime и выполнения его с помощью node.