promise 的 catch 方法专门捕获链中最近未处理的拒绝,错误向后传递至首个 catch;末尾统一加 catch 是推荐做法,可避免未处理拒绝,且比 then(null, fn) 更清晰安全。

Promise 的 catch 方法专门用于捕获异步操作中的错误,它等价于 .then(null, rejectionHandler),但语义更清晰、链式调用更自然。
catch 捕获的是 Promise 链中最近的未处理拒绝
Promise 链中一旦某个环节抛出错误(或返回被拒绝的 Promise),错误会沿链向后传递,直到遇到第一个 catch。如果中间有 then 处理了失败回调,就不会继续往下传。
- 没写
catch→ 错误会变成未处理拒绝(Uncaught Promise Rejection),控制台报错,可能影响程序稳定性 - 多个
catch→ 只有第一个能捕获,后续的不会触发(除非前面的catch再次抛出错误) -
catch后还能接then→ 表示错误已被处理,后续可继续正常流程
正确写法:链式末尾加 catch 或嵌套中就近捕获
推荐在 Promise 链末尾统一用 catch,简洁且不易遗漏;若某一步错误需特殊处理(比如重试、降级),可在对应位置单独加 catch。
fetch('/api/data')
.then(res => {
if (!res.ok) throw new Error('HTTP error');
return res.json();
})
.then(data => console.log(data))
.catch(err => console.error('请求失败:', err.message));
也可在中间拦截:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
someAsyncTask()
.catch(err => {
console.warn('第一步失败,尝试备用方案');
return fallbackTask(); // 返回新 Promise,链继续
})
.then(result => console.log(result));
注意 async/await 中的 catch 不是 Promise 方法,但逻辑一致
虽然 async/await 看起来像同步代码,但它底层仍是 Promise。错误仍需用 try...catch 捕获,本质和 catch 方法作用相同。
async function loadData() {
try {
const res = await fetch('/api/data');
const data = await res.json();
return data;
} catch (err) {
console.error('加载失败:', err);
}
}
混用时注意:await 后的 Promise 若被拒绝,会直接抛出错误,相当于自动进入 catch 块。
常见误区:漏写 catch、用 then 第二个参数代替、忽略错误再抛出
只写 then(success) 不写失败处理,等于放弃错误捕获;用 then(success, fail) 虽可行,但不如 catch 明确,且无法捕获 success 回调内部抛出的错误。
- ❌ 错误示范:
promise.then(handleSuccess).then(handleNext)—— 中间出错就没人管 - ✅ 正确做法:
promise.then(handleSuccess).catch(handleError) - ⚠️ 注意:
catch里若没重新抛错或返回 Promise,链会从这里恢复为 fulfilled 状态
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










