全局监控 promise 未捕获异常需监听 unhandledrejection 事件,它是事后通知机制,不中断执行;浏览器端用 window.addeventlistener 注册,node.js 需 process.on 监听并设 exitcode=0 防退出。

全局监控 Promise 未捕获异常,核心是监听 unhandledrejection 事件。它不是错误拦截器,而是“事后通知机制”,专为发现遗漏的异步错误而设计,不中断执行,但必须主动监听才能捕获。
浏览器端:用 window.addEventListener 绑定监听
在应用初始化阶段尽早注册,确保覆盖所有后续 Promise:
- 监听器接收 event 对象,其中 event.reason 是拒绝原因(可能是 Error、字符串或任意值),event.promise 是被拒绝的 Promise 实例
- 调用 event.preventDefault() 可抑制控制台默认的黄色警告(生产环境建议关闭,开发阶段可保留辅助调试)
- 不要依赖该事件“挽救”错误——它不能自动补上 .catch(),只适合日志、上报或提醒
统一处理 event.reason 的类型差异
reason 不总是 Error 实例,直接取 .stack 或 .message 可能报错。需做安全封装:
- 若
reason instanceof Error,提取message和stack - 若为字符串,用
new Error(reason)包装,保留原始信息 - 其他类型(如数字、对象)统一转为
String(reason),避免序列化失败
上报到前端监控系统
捕获后应纳入统一错误体系,提升可观测性:
- 上报字段建议包含:
type: 'promise_rejection'、message、stack、url、timestamp,还可补充用户行为路径、UA 等上下文 - 优先使用 navigator.sendBeacon 上报,确保页面卸载时数据不丢失;若不可用,降级为
fetch(..., { keepalive: true })或异步XMLHttpRequest - 添加频率限制(如每分钟最多上报 5 条同类错误),防止刷屏和带宽浪费
Node.js 环境需额外注意
行为与浏览器不同,v15+ 默认将未处理拒绝视为致命错误并退出进程:
- 必须用 process.on('unhandledRejection', (reason, promise) => {...}) 显式监听
- 监听后建议设置
process.exitCode = 0防止进程意外退出 - 可同时监听
rejectionHandled事件,识别“延迟捕获”情况(Promise 后来被 .catch())











