为什么Try Catch块没有捕获Promise异常?

Why doesn#39;t the try catch block catch the promise exception?(为什么Try Catch块没有捕获Promise异常?)

本文介绍了为什么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块处理该错误?

推荐答案

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

  1. test中抛出的错误位于test的同步(非异步)部分。为什么它是承诺拒绝而不是同步例外?

  2. 来自test()的承诺正在被拒绝,为什么catch没有捕获该拒绝?

#1-为什么是拒绝?

因为即使async函数在其工作的同步部分抛出,这只是拒绝它返回的承诺,不会引发同步错误。这只是在设计async函数时做出的一个设计决定,而且是一个聪明的决定--如果在抛出函数的同步部分时是同步错误,但在那之后是承诺被拒绝,那将是混乱和难以理解的。所以很简单:抛出一个async函数总是拒绝它的承诺。

(这与Promise构造函数处理传入的Executor回调的方式一致。当您这样做时new Promise((resolve, reject) => /*...*

本文标题为:为什么Try Catch块没有捕获Promise异常?

基础教程推荐