可通过监听 unhandledrejection 事件捕获未处理的 promise 拒绝:浏览器中用 window.addeventlistener,node.js 中用 process.on;event.reason 和 event.promise 提供拒绝原因和 promise 实例;仅作兜底日志,不可替代显式错误处理。

可以通过监听全局的 unhandledrejection 事件来捕获未被 .catch() 或 await 捕获的 Promise 拒绝(reject)。
监听 unhandledrejection 事件
在浏览器或 Node.js 环境中,只要 Promise 被 reject 且没有在微任务队列结束前被处理,就会触发该事件。
基本写法:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
window.addEventListener('unhandledrejection', event => {
console.error('未处理的 Promise 拒绝:', event.reason);
// 可选:阻止默认行为(如控制台警告)
event.preventDefault();
});
event 对象的关键属性
event.reason:Promise 拒绝时传入的值(可能是 Error 实例、字符串、数字等)
event.promise:发生拒绝的 Promise 实例(可用于调试或日志关联)
event.preventDefault():调用后可抑制浏览器默认的控制台警告(仅浏览器环境有效)
Node.js 中的等价写法
Node.js 使用 process 对象监听:
process.on('unhandledRejection', (reason, promise) => {
console.error('未处理的 Promise 拒绝:', reason);
// 注意:Node.js 中没有 preventDefault,但可以记录并主动退出(谨慎使用)
// process.exit(1); // 一般不推荐直接退出,除非关键错误
});
注意事项与最佳实践
- 它只是“兜底”机制,不能替代显式错误处理(如
.catch()或try/catch包裹await) - 不要在该回调中执行异步操作(如发送网络请求),因为此时事件循环可能已进入下一阶段,容易遗漏上下文
- 建议只做日志记录、上报错误、或触发监控告警,避免业务逻辑依赖它恢复流程
- 多个监听器会按注册顺序依次执行,但无法阻止其他监听器运行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










