为何try/catch无法捕获Promise构造函数中抛出的错误?代码出现unhandledRejection异常的原因咨询
为什么我的try/catch没捕获到Promise里的异步错误?
这问题我之前也踩过坑!核心原因是你在手动创建Promise的时候,把async函数作为了executor(就是new Promise里的那个回调),这会导致内部的错误无法被外层的try/catch捕获,反而变成了未处理的Promise拒绝。
咱们来拆解下你的代码逻辑:
- 你的
run函数返回了一个手动创建的Promise,但这个Promise的executor是async resolve => { ... }——注意这个executor本身是个async函数。 - 在executor里,
await throwError()会触发throwError抛出的错误,但因为executor是async函数,这个错误会被async函数自动包装成一个Promise的拒绝。 - 重点来了:这个由async executor产生的拒绝Promise,和你手动创建的那个Promise是完全独立的!你手动创建的Promise根本不知道这个错误的存在,它会一直处于pending状态,而executor内部的错误就变成了“没人管”的未处理rejection,直接触发了全局的
unhandledRejection事件。 - 外层的
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
相关产品推荐
相关产品推荐

