.catch() 只捕获其左侧最近未被处理的 rejection,不跨过已处理错误或已 resolve 的环节;它响应所绑定 Promise 的状态变化,捕获后默认返回 resolved 以继续链式执行。

.catch() 在 Promise 链中只捕获它前面(左侧)最近的、尚未被处理的错误,不跨过已处理的 Promise 或已 resolve 的环节。
它只捕获“上游”未被处理的 rejection
Promise 链是线性的,.catch() 就像一个“错误接收器”,只对它左边连续的、没被 .catch() 或 .then(null, handler) 拦截过的 rejection 生效。一旦某个错误被中间的 .catch() 吃掉,后续的 .catch() 就收不到它了。
- Promise.reject(1).catch(() => 2).catch(() => 3) → 第二个 .catch 不会执行,因为第一个已处理错误
- Promise.reject(1).then(null, () => 2).catch(() => 3) → 第二个 .catch 同样不执行,因为 .then 的第二个参数等价于 .catch
它无法捕获同步代码或 .then 中抛出的新错误(除非在回调里)
.catch() 只响应它所绑定的 Promise 实例的状态变化。如果在 .then 的成功回调里 throw new Error(),这个错误会被自动包装成新的 rejection,并被下一个 .catch() 捕获——但这是新产生的 rejection,不是原始错误的“延续”。
- Promise.resolve().then(() => { throw 'oops' }).catch(e => console.log(e)) → 输出 'oops'
- Promise.resolve().then(() => { throw 'oops' }); // 没有后续 .catch → 错误静默,触发 unhandledrejection
多个 .catch() 可以分层处理不同阶段的错误
你可以把 .catch() 放在链的不同位置,实现局部错误恢复或降级逻辑。比如请求失败后重试一次,再失败才上报:
立即学习“Java免费学习笔记(深入)”;
- fetch('/api').catch(() => fetch('/backup')).catch(err => report(err))
- 注意:第一个 .catch 返回新 Promise(如 fetch 调用),它的状态决定链是否继续;返回普通值则转为 resolved
.catch() 不影响链的后续执行流程
只要 .catch() 回调不抛出新错误,它默认返回 resolved 状态的 Promise,链会继续向下走 .then。这是它和同步 try/catch 的关键区别:错误被捕获后,流程可以继续,而不是中断。
- Promise.reject('fail').catch(() => 'recovered').then(val => console.log(val)) → 输出 'recovered'
- 若想中断链,可在 .catch() 里 re-throw,或返回 Promise.reject()


















