全局捕获未处理的 Promise 异常主要依靠 unhandledrejection 事件,它在 Promise 被 reject 且未被 .catch() 或 await 捕获时触发,用于监控和日志上报,但无法恢复 rejected 状态。

在 JavaScript 中,全局捕获未处理的 Promise 异常主要靠 unhandledrejection 事件。它会在 Promise 被 reject 且没有被 .catch() 或 await 捕获时触发。
监听 unhandledrejection 事件
该事件是 window(浏览器)或 process(Node.js)对象上的标准事件,需尽早注册,避免遗漏早期异常:
- 浏览器中监听
window.addEventListener('unhandledrejection', handler) - Node.js 中监听
process.on('unhandledRejection', handler) - 回调函数接收一个
event对象(浏览器)或两个参数:reason和promise(Node.js)
正确处理 event.reason 和 event.promise
浏览器中 event 包含 reason(拒绝原因)和 promise(出问题的 Promise 实例),可用来记录、上报或调试:
window.addEventListener('unhandledrejection', (event) => {
console.error('Unhandled rejection:', event.reason);
console.log('Rejected promise:', event.promise);
event.preventDefault(); // 阻止默认控制台警告(可选)
});
Node.js 中写法略有不同:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
process.on('unhandledRejection', (reason, promise) => {
console.error('Unhandled rejection at:', promise);
console.error('Reason:', reason);
});
注意:不能用它“挽救”错误流程
unhandledrejection 是兜底机制,仅用于监控和日志,**无法恢复 Promise 的 rejected 状态**,也不能阻止程序逻辑继续出错:
- 它不改变 Promise 本身行为,后续仍会处于 rejected 状态
- 不能在这里调用
resolve或reject来“修复”那个 Promise - 真正健壮的做法仍是主动加
.catch()或用try/catch包裹await
配合 rejectionHandled 补充监控
浏览器还提供 rejectionhandled 事件,当一个曾被标记为“未处理”的 Promise 后来被 .catch() 捕获时触发,可用于检测延迟处理情况:
window.addEventListener('rejectionhandled', (event) => {
console.log('Previously unhandled promise is now handled:', event.promise);
});
这对排查“先报错后补 catch”类问题有帮助,但日常开发中较少主动使用。

















