可以捕获来自非等待异步调用的错误,将其发送到原始封装 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 转换来转译代码,并使用节点执行它。
最佳答案
处理未处理的被拒绝的 native Promise(并且 async/await 使用 native Promise)是 V8 中现在支持的功能。它在最新的 Chrome 中用于在未处理被拒绝的 Promise 时输出调试信息;尝试以下地址 the Babel REPL :
async function executor() {
console.log("execute");
}
async function doStuff() {
console.log("do stuff");
throw new Error("omg");
}
function handleException() {
console.error("Exception handled");
}
(async function() {
try {
await executor();
doStuff();
} catch(e) {
handleException();
}
})()
您会看到,即使 doStuff()
的异常丢失(因为我们在调用它时没有使用 await
),Chrome 也会记录拒绝的情况控制台未处理 promise :
这在 Node.js 4.0+ 中也可用,尽管它需要监听 a special unhandledRejection
event :
process.on('unhandledRejection', function(reason, p) {
console.log("Unhandled Rejection at: Promise ", p, " reason: ", reason);
// application specific logging, throwing an error, or other logic here
});
关于javascript - 我可以在不使用await的情况下捕获异步错误吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30649994/