生产环境异步异常需全局监听+上下文增强+可靠上报三者结合:监听unhandledrejection和error事件覆盖全部异步错误源,补全路由、用户身份等关键上下文,优先sendbeacon上报并配置降级与节流策略。

生产环境的异步异常容易静默丢失,关键不是“有没有捕获”,而是“捕得全、带得全、发得到”。必须组合使用全局监听 + 上下文增强 + 可靠上报三类手段,缺一不可。
覆盖全部异步错误源:unhandledrejection + error 事件双监听
Promise 拒绝、setTimeout 内抛错、fetch 失败未 catch 等,默认不触发 window.onerror。仅靠 try/catch 或 .catch() 远远不够。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 监听
unhandledrejection:捕获所有未被.catch()或await处理的 Promise 错误;务必调用event.preventDefault()阻止控制台干扰,但不影响上报 - 监听
error事件:覆盖资源加载失败(如 script、img)、setTimeout/setInterval中未捕获异常、同步执行中漏掉的错误 - 避免重复:对同一错误对象(可用
===判断或生成唯一errorId)做轻量去重,防止日志刷屏
补全可追溯上下文:不只是堆栈,还要业务现场
没有上下文的错误堆栈,就像只有经纬度没有地图——定位不了问题。单纯上报 reason.stack 或 event.error?.stack 是远远不够的。
- 在发起关键异步操作前,记录轻量调用链快照,例如
new Error().stack.split('\n').slice(0, 3).join(' → ') - 透传 traceId:从全局 context、URL 参数或 localStorage 读取,确保前后端链路可串联
- 必带字段:当前路由(
location.pathname)、用户身份(脱敏后 ID 或角色)、设备信息(navigator.userAgent)、网络状态(navigator.onLine)、SDK 版本、页面可见性(document.hidden)
保障上报必达:sendBeacon 为主,降级策略兜底
上报本身不能成为故障点。用户关闭页面、网络抖动、高频报错都可能导致日志丢失。
- 优先用
navigator.sendBeacon():支持跨域、不阻塞卸载、浏览器保证发送,是生产首选 - 降级方案:若
sendBeacon不可用(如旧版 Safari),退回到new Image().src = url(GET 请求)或fetch(url, { keepalive: true }) - 节流与缓存:1 分钟内同类错误超 5 次则采样上报;失败日志暂存
localStorage,下次打开页面时补发(注意清理过期项)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










