监听全局 unhandledrejection 是捕获漏掉的 promise 拒绝错误的最后一道防线,需在脚本早期绑定到 window,处理 event.reason 类型并上报有效信息,建议调用 preventdefault() 并配合 rejectionhandled 避免误报。

监听全局 unhandledrejection 是捕获漏掉的 Promise 拒绝错误的关键手段,它不替代局部 .catch() 或 try/catch,而是作为最后一道防线。
浏览器中正确注册监听器
必须在脚本执行早期绑定,确保覆盖所有异步路径:
- 推荐放在
内首个<script></script>中,或使用defer属性的外链脚本顶部 - 监听对象是
window,事件名严格为字符串'unhandledrejection' - 回调函数接收一个
event对象,含reason(拒绝值)和promise(被拒绝的 Promise 实例)两个关键属性
提取并上报有效错误信息
reason 不一定是 Error 对象,需做类型判断再取堆栈:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 优先检查
event.reason instanceof Error,是则用event.reason.stack和event.reason.message - 否则降级使用
String(event.reason),避免undefined或null导致上报失败 - 可附加上下文:当前 URL、用户 ID、页面标题、时间戳等,提升排查效率
是否调用 preventDefault
默认行为是在控制台输出警告,生产环境建议调用 event.preventDefault():
- 防止污染开发者工具日志,干扰正常调试
- 不影响你自己的日志记录或错误上报逻辑
- 开发阶段可暂时注释掉,便于快速发现未处理的 reject
配合 rejectionhandled 避免误报
某些 Promise 先被 reject,稍后才被 catch(比如延迟注册 handler),此时会先触发 unhandledrejection,再触发 rejectionhandled:
- 可用
Map缓存未处理的 rejection,key 为event.promise - 在
rejectionhandled回调中清除对应项,撤销已发出的告警或上报 - 这对长生命周期或动态加载的模块特别有用
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










