promise链中错误默认向后传递直至遇到首个catch或带拒绝处理的then;“隔级catch”实为错误穿透中间无处理器的then,被下游最近拒绝处理器捕获。

Promise链中上一个 then 抛出的错误,**默认会沿着链向后传递,直到遇到第一个 catch 或带拒绝处理的 then(onFulfilled, onRejected)**。所谓“隔级 catch”能精准拦截,并不是靠跳过中间环节,而是因为中间没有错误处理器——错误会穿透(propagate)过去,最终被下游最近的拒绝处理器捕获。
错误传递机制:没有处理就继续往下传
Promise 链的错误传播遵循“冒泡”规则:只要某个 then 的成功回调里抛出异常(或返回被拒绝的 Promise),而它之后的 then 没有提供失败回调(即第二个参数),这个错误就会跳过该 then,传给下一个有拒绝处理能力的节点。
-
then(onFulfilled)→ 只处理成功,不处理失败,错误直接透传 -
then(onFulfilled, onRejected)→ 显式处理失败,错误在此终止 -
catch(onRejected)→ 等价于then(null, onRejected),专门捕获前面所有未处理的拒绝
“隔级” catch 能捕获的前提:中间无拒绝处理器
例如:
Promise.resolve(1)
.then(x => { throw new Error('A'); }) // 抛出错误
.then(x => console.log('never runs')) // 无失败回调 → 错误穿透
.then(x => console.log('also never')) // 同样穿透
.catch(err => console.error(err.message)); // ✅ 捕获到 'A'
这里两个中间 then 都只写了成功回调,没写第二个参数,因此错误一路向下,最终被最后的 catch 拦截。这不是“跳级”,而是“无人接手,只能送到终点”。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
如何做到“精准”拦截?关键在控制传播路径
所谓“精准”,是指明确知道哪个 catch 会处理哪类错误。实现方式包括:
-
按业务域分层加 catch:比如网络请求层、数据转换层、UI 层各自用
catch处理对应问题,上层catch不再透传无关错误 -
在中间
then主动返回新 Promise:用Promise.resolve()或Promise.reject()显式控制流向 -
用
then(null, handler)做局部兜底:在可能出错的环节后立刻加拒绝处理,避免错误意外穿透到远端
注意:return 一个被 reject 的 Promise 和 throw 效果一致
以下两种写法对错误传播完全等效:
.then(() => { throw new Error('boom'); })
// 等价于
.then(() => Promise.reject(new Error('boom')))
它们都会触发后续链上的第一个拒绝处理器,无论中间隔了多少个无错误处理的 then。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










