promise链错误处理重在可追踪、可干预、可恢复,错误自动冒泡至.catch()或try/catch;需规范收口、区分错误类型、避免静默吞错;多请求宜用allsettled容错;.then中throw可主动中断;finally用于统一善后。

Promise 链的错误处理不是“防错”,而是让错误可追踪、可干预、可恢复。
错误会自动沿链向下传递,直到遇到 .catch() 或 try/catch。这个“冒泡”机制本身就很高效,但容易用错——优化重点不在重写逻辑,而在用对位置、选对工具、加对兜底。
错误要收口,但不能吞掉
在链末尾加 .catch() 是基本要求,但空 catch 或只 console 而不处理,等于没做:
- ✅ 记录错误上下文(比如请求地址、参数、阶段)
- ✅ 区分业务错误与系统错误(如
new ApiError('USER_NOT_FOUND')) - ❌ 避免
.catch(() => {})这类静默吃错
fetch('/api/profile')
.then(res => {
if (!res.ok) throw new Error(`HTTP ${res.status}`);
return res.json();
})
.then(data => transform(data))
.catch(err => {
console.error('[Profile Fetch]', err.message); // 带标签便于排查
throw new AppError('PROFILE_LOAD_FAILED', { cause: err });
});
多请求场景下,别让一个失败拖垮全部
Promise.all() 一错全停,适合强依赖;但多数列表加载、配置并行请求,更适合容错:
- 用
Promise.allSettled()获取每个请求的完整状态(fulfilled/rejected) - 对失败项单独打点、重试或降级(如用本地缓存替代)
const requests = urls.map(url =>
fetch(url).then(r => r.json()).catch(e => ({ error: e, url }))
);
const results = await Promise.allSettled(requests);
const data = results
.filter(r => r.status === 'fulfilled')
.map(r => r.value);
链中主动中断,比等它崩更可控
在 .then() 里用 throw 可提前终止流程,配合后续 .catch() 分流处理:
- 用户状态校验失败 → 跳转登录页
- 数据格式异常 → 返回默认结构,不中断渲染
.then(user => {
if (user.role !== 'admin') {
throw new PermissionError('Access denied');
}
return loadAdminData();
})
.catch(err => {
if (err instanceof PermissionError) {
router.push('/login');
return;
}
throw err; // 其他错误继续上抛
});
finally 不是错误处理,而是善后必做项
.finally() 不接收错误参数,但它能统一清理资源,避免遗漏:
- 关闭 loading 动画
- 释放锁、取消 pending 请求、清空临时缓存
fetchData() .then(showContent) .catch(showError) .finally(() => setLoading(false)); // 无论成败都执行
不复杂但容易忽略










