可通过监听 unhandledrejection 事件全局捕获未处理的 promise 拒绝:浏览器中绑定到 window,node.js 中绑定到 process;事件对象含 reason(拒绝原因)和 promise(原始 promise 实例),建议判别 reason 类型统一日志格式,但不可替代显式错误处理。

在 JavaScript 中,可以通过监听 unhandledrejection 事件来全局捕获未被 .catch() 或 await 处理的 Promise 拒绝(reject)状态。
监听 unhandledrejection 事件
该事件在 Promise 被 reject 且没有被任何处理程序捕获时触发,浏览器和 Node.js(v15+)均支持:
- 浏览器中挂载到
window对象上 - Node.js 中挂载到
process对象上
示例(浏览器环境):
window.addEventListener('unhandledrejection', event => {
console.error('未捕获的 Promise 拒绝:', event.reason);
// 可选:阻止默认行为(如控制台报错)
event.preventDefault();
});
注意 event 对象的关键属性
event 对象包含两个主要属性:
- reason:Promise 拒绝时传入的值(可能是 Error 实例、字符串、数字等)
- promise:发生拒绝的原始 Promise 实例(可用于调试或记录上下文)
建议优先检查 event.reason 是否为 Error 实例,便于统一日志格式:
if (event.reason instanceof Error) {
console.error('Error:', event.reason.stack);
} else {
console.error('Non-Error rejection:', event.reason);
}
Node.js 环境下的等效写法
Node.js 使用 process.on('unhandledRejection'),注意大小写:
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled Rejection at:', promise, 'reason:', reason);
// 通常建议在此处记录错误,但不要直接 process.exit()
// 因为可能还有其他异步任务需要完成
});
常见误区与建议
- 仅靠
unhandledrejection不等于“兜底所有错误”——它只捕获 Promise 拒绝,不捕获同步异常或未捕获的error事件 - 不能用它替代合理的错误处理逻辑,而应作为最后防线 + 监控手段
- 在开发阶段保留默认行为(不调
preventDefault),方便发现遗漏的错误处理 - 生产环境可结合 Sentry、Bugsnag 等工具上报
reason和堆栈信息
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











