[英]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 块不应该处理错误吗?
我可以看到您的问题的两个可能方面:
在test
中抛出的错误在test
的同步(非异步)部分。 为什么是 promise 拒绝而不是同步异常?
来自test()
的 promise 被拒绝,为什么不catch
那个拒绝?
因为即使async
function 在其工作的同步部分抛出,也只是拒绝它返回的 promise,它不会引发同步错误。 这只是async
函数设计过程中的一个设计决定,也是一个聪明的决定——如果在 function 的同步部分抛出同步错误,但之后被 promise 拒绝,那将是混乱且难以理解的。 所以很简单:投入async
function 总是拒绝它的 promise。
(这与 promise 构造函数如何处理您传递给它的执行程序回调一致。当您执行new Promise((resolve, reject) => /*...*/})
时,promise 构造函数会调用您的 ZC1C425Z0548E68384F1C1,但是 7A94F1C如果您在调用期间抛出,它会使用您抛出的内容来拒绝 promise,而不是允许它作为同步异常继续。)
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.