繁体   English   中英

为什么 try catch 块不能捕获 promise 异常?

[英]Why doesn't the try catch block catch the promise exception?

我对使用承诺的错误处理感到困惑。 答案可能很明显,但我不明白。

我有以下示例代码:

var test = async function(){
  throw new Error('Just another error')
}

try {
  test().then()
}
catch(err){
  alert('error: ' + err.toString())
}

在我的浏览器中,我没有在控制台中收到警报和Uncaught (in promise) Error 这是为什么? try..catch 块不应该处理错误吗?

我可以看到您的问题的两个可能方面:

  1. test中抛出的错误在test的同步(非异步)部分。 为什么是 promise 拒绝而不是同步异常?

  2. 来自test()的 promise 被拒绝,为什么不catch那个拒绝?

#1 - 为什么是拒绝?

因为即使async function 在其工作的同步部分抛出,也只是拒绝它返回的 promise,它不会引发同步错误。 这只是async函数设计过程中的一个设计决定,也是一个聪明的决定——如果在 function 的同步部分抛出同步错误,但之后被 promise 拒绝,那将是混乱且难以理解的。 所以很简单:投入async function 总是拒绝它的 promise。

(这与 promise 构造函数如何处理您传递给它的执行程序回调一致。当您执行new Promise((resolve, reject) => /*...*/})时,promise 构造函数会调用您的 ZC1C425Z0548E68384F1C1,但是 7A94F1C如果您在调用期间抛出,它会使用您抛出的内容来拒绝 promise,而不是允许它作为同步异常继续。)

#2 - 为什么catch块没有捕获到拒绝?

因为您没有使用await Promise 拒绝仅在您await promise 时例外。 如果使用 promise 方法then / catch / finally来附加处理程序,拒绝是通过调用拒绝处理程序来处理的,而不是由异常机制处理的。

所以要么使用 promise 方法来附加履行和拒绝处理程序:

test()
.then(result => {
    // ...use `result` here...
})
.catch(error => {
    // ...handle/report error here...
});

或者在async function 中使用await (或者如果您的环境中有顶级await ,则在模块的顶级):

// In an `async` function (or the top level of a module in cutting-edge environments)
try {
    const result = await test();
    // ...use `result` here...
}
catch(err){
    // ...handle/report error here...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM