Promise链中未处理异常需靠末尾.catch()和全局unhandledrejection事件拦截;async/await须用try/catch或外层.catch(),否则导致unhandled rejection。

在 Promise 链中,未处理的异常(unhandled rejection)不会自动被上层 catch 捕获,除非它发生在链内且有明确的错误传递路径。真正能“拦截未处理异常”的,不是某个特定 catch 语句,而是靠两个关键机制:链式 .catch() 的正确放置,以及全局监听 unhandledrejection 事件。
确保 Promise 链末尾有 .catch()
这是最常用、最直接的方式——把 .catch() 放在链的最后,捕获前面所有 reject 或同步/异步抛出的错误:
fetch('/api/data')
.then(res => {
if (!res.ok) throw new Error('HTTP error');
return res.json();
})
.then(data => console.log(data))
.catch(err => {
// 这里能捕获 fetch 失败、JSON 解析失败、上面 throw 的错误
console.error('请求或处理出错:', err);
});
- 只要链中任意一步
reject或throw,错误会顺着链向后传递,直到遇到第一个.catch() - 如果链中间已有
.catch()但没重新抛出(比如只做日志),后续步骤就不会再进入这个错误分支,可能造成“静默失败” - 避免写成
.then(success, fail)形式,它无法捕获success回调内部抛出的错误
用 window.addEventListener('unhandledrejection') 做兜底
当 Promise 被 reject 且**整个微任务队列结束时仍未被任何 .catch() 处理**,浏览器会触发 unhandledrejection 事件。这是真正的“未处理异常”拦截点:
window.addEventListener('unhandledrejection', event => {
console.warn('未被捕获的 Promise 错误:', event.reason);
// 可以上报错误、显示提示等
event.preventDefault(); // 阻止默认控制台警告(可选)
});
- 适用于调试遗漏的错误处理,或作为生产环境的错误兜底方案
- 注意:Node.js 中对应的是
process.on('unhandledRejection') - 仅用于监控和补救,不能替代链内的合理
.catch()
避免常见陷阱:async/await 中的错误处理
使用 async/await 时,错误仍需显式捕获,否则也会变成 unhandled rejection:
立即学习“Java免费学习笔记(深入)”;
async function loadData() {
try {
const res = await fetch('/api/data');
if (!res.ok) throw new Error('HTTP error');
const data = await res.json();
return data;
} catch (err) {
console.error('加载失败:', err);
throw err; // 如果不 re-throw,调用方可能收不到错误
}
}
// 正确调用(带 catch)
loadData().catch(console.error);
// ❌ 错误:没 catch,错误就变成 unhandled rejection
loadData();
-
await后面的 Promise reject,会以异常形式抛出,必须用try/catch或外层.catch() - 忘记给顶层 async 函数加
.catch()是 unhandled rejection 的高频原因 - 多个并行 Promise(如
Promise.all([p1, p2]))失败时,错误也需统一处理
检查和调试未处理异常
开发时可主动检测潜在问题:
- 浏览器开发者工具中开启 “Pause on caught exceptions” 和 “Pause on uncaught exceptions”
- 在控制台留意黄色警告:“Uncaught (in promise)”,说明发生了未处理 rejection
- 使用 ESLint 插件(如
eslint-plugin-promise)检查漏掉的.catch() - 在测试中模拟 reject,验证错误路径是否被覆盖


















