You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何try/catch无法捕获Promise构造函数中抛出的错误?代码出现unhandledRejection异常的原因咨询

为什么我的try/catch没捕获到Promise里的异步错误?

这问题我之前也踩过坑!核心原因是你在手动创建Promise的时候,把async函数作为了executor(就是new Promise里的那个回调),这会导致内部的错误无法被外层的try/catch捕获,反而变成了未处理的Promise拒绝。

咱们来拆解下你的代码逻辑:

  1. 你的run函数返回了一个手动创建的Promise,但这个Promise的executor是async resolve => { ... }——注意这个executor本身是个async函数。
  2. 在executor里,await throwError()会触发throwError抛出的错误,但因为executor是async函数,这个错误会被async函数自动包装成一个Promise的拒绝。
  3. 重点来了:这个由async executor产生的拒绝Promise,和你手动创建的那个Promise是完全独立的!你手动创建的Promise根本不知道这个错误的存在,它会一直处于pending状态,而executor内部的错误就变成了“没人管”的未处理rejection,直接触发了全局的unhandledRejection事件。
  4. 外层的try/catch在等待的是run()返回的那个pending的Promise,自然捕获不到这个“跑出去”的错误。

解决方法有两种,选哪种看你的需求:

方法一:去掉多余的手动Promise包装(最推荐)

因为你的callback本身就是async函数,直接返回它的执行结果就行,完全没必要手动包一层Promise:

async function run(callback) {
  return callback();
}

这样run()返回的就是callback()的Promise,里面的错误会正常传递到外层的try/catch里。

方法二:如果一定要手动创建Promise,别让executor是async函数,或者手动捕获错误并调用reject

如果你的场景确实需要手动创建Promise(比如有其他同步逻辑要处理),要么用普通函数作为executor,通过then/catch传递状态:

async function run(callback) {
  return new Promise((resolve, reject) => {
    callback().then(resolve).catch(reject);
  });
}

要么如果非要用async executor(不推荐,没必要),就手动捕获内部错误并调用reject:

async function run(callback) {
  return new Promise(async (resolve, reject) => {
    try {
      await throwError();
      resolve();
    } catch (err) {
      reject(err);
    }
  });
}

关键知识点提醒

手动创建Promise时,永远不要把async函数作为executor——async函数的错误会被自身的Promise机制处理,无法自动传递给你手动创建的Promise,很容易导致这种“消失的错误”。只有普通的executor函数里,抛出的错误才会自动触发Promise的reject。

内容的提问来源于stack exchange,提问作者Lxxyx

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 17:48:14