【发布时间】:2015-08-19 10:16:17
【问题描述】:
是否可以捕获来自非等待异步调用的错误,将其发送到原始封装 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 转换转换代码,并使用节点执行它。
【问题讨论】:
-
我不确定你想达到什么目的,但有理由不使用承诺吗?
-
使用支持未处理拒绝检测的承诺库。
-
汤姆,不是真的,不。我故意在 promises 上使用 async/await 来看看此时可以用 es7 语法做什么,这是我在玩它时遇到的一个问题。 Bergi,如果目前没有其他选择(我怀疑可能是这种情况),我肯定会回到那个位置。
-
@dvlsg 请注意,使用 Babel,您有一个 bluebirdCoroutines 转换,可让您将 bluebird Promise 与本机 async/await 一起使用。
标签: javascript async-await promise ecmascript-2016