Promise 状态一旦 resolve 就不可逆,后续 throw 不会被 .catch 捕获;错误脱离 Promise 控制流,成为同步异常,需外层 try/catch 拦截;正确做法是在 resolve 前 reject 或在未 settle 的 then 中 throw。

不会被捕获。
Promise 的状态一旦从 pending 变为 fulfilled(即 resolve 被调用),就不可逆,后续再 throw 错误,这个错误就脱离了 Promise 的控制流,变成一个普通的同步异常,不会触发任何 .catch(),也不会被链式处理捕获。
关键点在于:
- resolve 执行后,Promise 状态已锁定为 fulfilled;
- 此时 throw 的错误发生在 Promise 外部的同步执行上下文中;
- 它不会自动转为 rejected,也不进入 Promise 的错误传播链;
- 若没被外层 try/catch 包裹,就会直接抛到全局,可能触发
uncaught exception。
比如:
立即学习“Java免费学习笔记(深入)”;
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
new Promise(resolve => {
resolve('done');
throw new Error('I am ignored by .catch'); // ❌ 不会被 .catch 捕获
}).catch(err => console.log('never runs'));
// 控制台:Uncaught Error: I am ignored by .catch类似地,以下情况也一样无效:
- 在
.then(() => { resolve(); throw ... })中 —— resolve 已调用,throw 就失效; - 在
async function中 await 后再 throw,但该 async 函数返回的 Promise 已 resolve —— throw 仍会冒泡,但不是 Promise 链的一部分。
✅ 正确做法是:
- 如果需要表示失败,必须在 resolve 前 reject,或用
return Promise.reject(...); - 或者在 then 回调中 throw(此时 Promise 还未 settle);
- 或统一用
throw/reject()保证只在一个“时机”改变状态。
常见误区:
- 认为“只要在 Promise 相关函数里 throw 就一定被 catch” → 实际只对 executor 和 then/catch 回调内有效;
- 忽略状态不可变性,误以为能“补救”已 resolve 的 Promise。
本质上,Promise 是一次性的状态容器,不是错误转发管道。

















