try/catch无法捕获promise.reject的问题

function f2() {
  try {
    Promise.reject('出错了');
  } catch(e) {
    console.log(e)
  }
}
  • 执行f2(),无法通过try/catch捕获promise.reject,控制台抛出Uncaught (in promise)
async function f() {
  try {
    await Promise.reject('出错了')
  } catch(e) {
    console.log(e)
  }
}
  • 为什么改成await/async后,执行f()就能在catch中捕获到错误了,并不会抛出Uncaught (in promise)
阅读 18.4k
5 个回答

这样应该就理解了吧,拒绝发生在未来回调只会在未来的事件循环中执行。

function f2() {
  try {
    Promise.reject('出错了').catch(err => {
      console.log('2', err)
    });
    console.log('1')
  } catch (e) {
    console.log(e)
  }
}

try..catch 结构,它只能是同步的,无法用于异步代码模式

回答这个问题,原理还是探究await到底执行了什么操作?
await:表示暂停异步函数promise,等待任意表达式的执行结果。
对于f2函数,Promise.reject('出错了')异步执行,但是没有catch函数进行reject处理。
对于f函数,await Promise.reject('出错了')。相当于在后面加一个catch处理方法,方法返回传入的‘出错了’信息,所以不会报错。

新手上路,请多包涵

因为
1、 try catch 无法捕获异步代码错误
2、 Promise.reject 是一个异步方法

21世纪了,用原生的async 和promise吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏