Why doesn#39;t the try catch block catch the promise exception?(为什么Try Catch块没有捕获Promise异常?)
问题描述
我对承诺的错误处理感到困惑。答案可能很明显,但我不明白。
我有以下示例代码:
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
的同步(非异步)部分。为什么它是承诺拒绝而不是同步例外?来自
test()
的承诺正在被拒绝,为什么catch
没有捕获该拒绝?
#1-为什么是拒绝?
因为即使async
函数在其工作的同步部分抛出,这只是拒绝它返回的承诺,不会引发同步错误。这只是在设计async
函数时做出的一个设计决定,而且是一个聪明的决定--如果在抛出函数的同步部分时是同步错误,但在那之后是承诺被拒绝,那将是混乱和难以理解的。所以很简单:抛出一个async
函数总是拒绝它的承诺。
(这与Promise构造函数处理传入的Executor回调的方式一致。当您这样做时new Promise((resolve, reject) => /*...*
本文标题为:为什么Try Catch块没有捕获Promise异常?
基础教程推荐
- 悬停时滑动输入并停留几秒钟 2022-01-01
- Karma-Jasmine:如何正确监视 Modal? 2022-01-01
- 当用户滚动离开时如何暂停 youtube 嵌入 2022-01-01
- 在for循环中使用setTimeout 2022-01-01
- 在 JS 中获取客户端时区(不是 GMT 偏移量) 2022-01-01
- 有没有办法使用OpenLayers更改OpenStreetMap中某些要素 2022-09-06
- 响应更改 div 大小保持纵横比 2022-01-01
- 动态更新多个选择框 2022-01-01
- 我什么时候应该在导入时使用方括号 2022-01-01
- 角度Apollo设置WatchQuery结果为可用变量 2022-01-01