JavaScript 中可通过监听 unhandledrejection 事件捕获全局未被 catch 处理的 Promise 拒绝错误,该事件在 Promise 被 reject 且无 .catch() 或 await try/catch 捕获时触发,需在 window(浏览器)或 process(Node.js)上注册,事件对象含 reason 和 promise 属性,调用 preventDefault() 可阻止默认警告但不推荐随意使用。

JavaScript 中可以通过监听 unhandledrejection 事件来捕获全局未被 catch 处理的 Promise 拒绝(reject)错误。
监听 unhandledrejection 事件
该事件在 Promise 被 reject 且没有被任何 .catch() 或 await 后的 try/catch 捕获时触发。推荐在脚本最开始就注册监听器,确保覆盖所有异步路径:
- 监听器需绑定在
window(浏览器)或process(Node.js)上; - 事件对象包含
reason(拒绝原因,可能是 Error 实例或任意值)和promise(出问题的 Promise 实例); - 调用
event.preventDefault()可阻止默认行为(如控制台警告),但不推荐随意阻止,除非你有完整日志/上报逻辑。
基础用法示例(浏览器环境)
在页面加载早期执行:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
window.addEventListener('unhandledrejection', event => {
console.error('未捕获的 Promise 错误:', event.reason);
// 可选:上报错误到监控服务
// reportError(event.reason, event.promise);
// event.preventDefault(); // 仅在明确处理后才调用
});
</script>
Node.js 环境中的等价处理
使用 process.on('unhandledRejection'):
立即学习“Java免费学习笔记(深入)”;
- 参数顺序为
(reason, promise); - 同样建议记录日志并做必要清理(如关闭资源),但不要静默吞掉错误;
- 若未监听该事件,Node.js 会在 v15+ 默认抛出未处理拒绝警告,并可能在未来版本中终止进程。
注意事项与最佳实践
避免常见误区:
-
不能靠它替代正确错误处理:它只是兜底,不是代替
.catch()或try/catch的理由; -
reason 不一定是 Error 对象:Promise 可以用任意值 reject,检查
reason instanceof Error再决定是否调用stack; - 重复监听需谨慎:多次添加相同逻辑可能导致重复上报,可考虑用单例或标志位去重;
-
配合 rejectionHandled 事件更完善:某些场景下 Promise 先被 reject,稍后才被 catch,此时会先触发
unhandledrejection,再触发rejectionhandled,可用于撤销临时告警。

















