dvl*_*lsg 27 javascript promise async-await ecmascript-7
可以捕获来自非等待异步调用的错误,发送到原始封装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();
Run Code Online (Sandbox Code Playgroud)
在这种情况下,抛出的错误fn2将被静默吞噬,并且绝对不会被原始文件捕获try/catch.我相信这是预期的行为,因为fn2很可能被推到事件循环以在将来某个时候完成,并且test在完成时并不关心(这是故意的).
有没有办法确保错误不会被这样的结构意外吞没,而不是放置try/catch内部fn2并做一些像发出错误的事情?我甚至会在不知道如何捕获它的情况下解决一个未被捕获的错误,我认为 - 我不希望抛出的错误是我正在编写的典型程序流程,但是吞下错误会使调试相对烦人.
旁注,我正在使用Babel来使用babel-runtime变换来转换代码,并使用node执行它.
Mic*_*ley 27
处理未处理的被拒绝的本机承诺(以及async/await使用本机承诺)是V8中现在支持的功能.当被拒绝的承诺未处理时,它在最新的Chrome中用于输出调试信息; 在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();
}
})()
Run Code Online (Sandbox Code Playgroud)
您可以看到,即使异常doStuff()丢失(因为我们在await调用它时我们没有使用),Chrome会记录拒绝的承诺未处理到控制台:

这也可以在Node.js 4.0+中使用,但它需要监听特殊unhandledRejection事件:
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
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12258 次 |
| 最近记录: |