异常会跳过后续then,进入最近catch;catch返回值决定后续链状态:正常返回则then执行,抛错或reject则继续传播;then的第二个参数不捕获自身回调错误,catch可捕获链中未处理的全部异常。

Promise 链中异常会跳过后续 then,直接进入最近的 catch
在 Promise 链中,只要某个 then 回调里抛出异常(包括 throw、运行时错误、reject() 调用),该 Promise 立即变为 rejected 状态,**后续所有 then 的成功回调会被跳过**,控制权交由链上**第一个能捕获该 rejection 的 catch(或 then 的第二个参数)**处理。
catch 之后的 then 仍可正常执行,前提是 catch 返回了 fulfilled Promise
catch 回调本身返回值决定后续链的状态:
- 如果 catch 中 return 一个普通值或 Promise.resolve(...) → 后续 then 的成功回调会被调用;
- 如果 catch 中 throw 或 return Promise.reject(...) → 异常继续向下游传播,后续 then 被跳过,直到遇到下一个 catch;
- 如果 catch 中没写 return(隐式返回 undefined) → 相当于返回
Promise.resolve(undefined),后续 then 会执行。
then 的第二个参数和 catch 行为等价,但作用域不同
promise.then(onFulfilled, onRejected) 中的 onRejected 只捕获前一个 Promise 的 rejection,不捕获自身 onFulfilled 里的异常;而 catch 是 then(null, onRejected) 的语法糖,且会捕获链中**前面所有未被处理的 rejection**(包括上游 then 成功回调里抛出的错误)。
例如:Promise.resolve().then(() => { throw 'err' }).catch(...) 中的 catch 能捕获该 throw;但若写成 .then(() => {}, () => {}),第二个参数对这个 throw 无效——因为它只响应前一个 Promise 的 reject,不响应自己回调里的异常。
多个 catch 可实现分层错误处理
你可以用多个 catch 实现“局部兜底 + 全局上报”:
- 中间 catch 处理特定错误(如网络重试),并 return 新 Promise;
- 末尾 catch 捕获所有漏掉的错误,做统一日志或提示;
- 注意:一旦某个 catch 没有 re-throw,错误就终止传播,不会触发更后面的 catch。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











