catch的位置决定其捕获范围:局部catch仅拦截左侧未处理的rejection,处理后链恢复fulfilled;全局catch置于链末可捕获所有未捕获错误,但需避免空catch吞错,多catch可分层处理不同阶段错误。

在 Promise 链式调用中,catch 的位置决定了它能捕获哪些错误——不是所有 catch 都是“全局”的,关键在于**错误传播路径是否经过它**。
局部 catch:只捕获上游 Promise 的 rejected 状态
每个 catch 只能捕获它前面(左侧)Promise 链中未被处理的 rejection。一旦某个 catch 处理了错误,后续链会恢复为 fulfilled 状态,除非它自己又抛出错误。
例如:
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
Promise.resolve()
.then(() => { throw new Error('A') })
.catch(err => {
console.log('捕获 A:', err.message); // ✅ 执行
return 'recovered';
})
.then(val => {
console.log(val); // ✅ 输出 'recovered'
})
.catch(() => console.log('不会执行')); // ❌ 不会触发
- 第一个
catch拦截了throw new Error('A'),并返回字符串 → 后续then接收到的是'recovered' - 第二个
catch前面没有 rejection,所以不生效
全局 catch:放在链最末端,覆盖整条链(但有局限)
把 catch 放在链的最后,可以捕获前面所有未被捕获的 rejection,这是最常见的“全局”做法:
fetch('/api/data')
.then(res => res.json())
.then(data => processData(data))
.catch(err => {
console.error('请求或解析或处理出错:', err);
});
- 只要任意一个
then中抛出错误、或返回被 reject 的 Promise,都会落到这个catch - ⚠️ 注意:如果中间某个
then内部用了try/catch吞掉同步错误,或返回了Promise.reject()却没被链上catch拦截,仍会继续向后传播
避免错误被意外吞掉:慎用空 catch 或无返回的 catch
以下写法看似“兜底”,实则可能掩盖问题:
someAsync()
.catch(() => {}) // ❌ 错误被静默丢弃
.then(() => doNext()); // 无论前面是否出错,这里都执行
- 空
catch让错误消失,后续逻辑无法区分成功/失败 - 若想继续链式执行但保留错误上下文,应在
catch中重新抛出:throw err,或返回Promise.reject(err) - 更安全的兜底方式是记录错误后主动 reject:
.catch(err => { log(err); return Promise.reject(err); })
多个 catch 的协作:按需分层处理
你可以为不同阶段设置专门的 catch,实现精细化错误响应:
fetch('/api/user')
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.catch(err => {
console.warn('网络或 HTTP 错误:', err.message);
throw err; // 继续向上传播
})
.then(user => fetch(`/api/profile/${user.id}`))
.catch(err => {
console.warn('获取用户资料失败:', err.message);
return { profile: null }; // 降级返回
})
.then(profile => render(profile));
- 第一个
catch聚焦网络层,仅记录并重抛 - 第二个
catch针对业务逻辑失败,选择降级而非中断流程 - 链末尾可再加一个终极
catch捕获所有漏网之鱼
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










