生产环境异步错误需主动捕获上报:用 unhandledrejection 捕获 promise 拒绝(调 preventdefault,取 reason.stack/message),结合 error 事件覆盖同步/资源/定时器异常;补充 traceid、路由、用户等上下文;用 sendbeacon 可靠上报,fallback 图片/fetch,节流采样,localstorage 缓存补报。

生产环境异步错误(如 Promise rejection、setTimeout 中抛出的异常、fetch 失败未 catch)默认不会触发 window.onerror,容易静默丢失,必须主动捕获并上报。
监听全局未捕获的 Promise 拒绝
使用 window.addEventListener('unhandledrejection') 捕获未被 .catch() 或 await 处理的 Promise 错误:
- 务必调用
event.preventDefault()防止浏览器默认控制台警告(但不影响上报) - 从
event.reason提取错误对象,优先尝试reason.stack和reason.message - 注意:部分浏览器中
reason可能是原始字符串或非 Error 实例,需做类型判断
兜底捕获所有未处理异步异常
结合 window.addEventListener('error') + unhandledrejection 覆盖大部分场景:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
error事件可捕获同步错误、资源加载失败、setTimeout/setInterval内未捕获异常 - 对
error事件中的error属性(如event.error)优先取 stack;若无,则拼接event.filename + ':' + event.lineno + ':' + event.colno - 避免重复上报:对同一个错误对象(可用
===或唯一errorId标记)做轻量去重
增强异步上下文与可追溯性
单纯捕获错误不够,需补充关键业务上下文才能快速定位问题:
- 在发起异步操作前,用
console.trace()或自定义栈快照(如new Error().stack)记录调用链起点 - 为请求添加 traceId(如从全局 context 或 localStorage 读取),并在错误上报 payload 中透传
- 记录当前路由、用户身份(脱敏)、设备信息、网络状态(
navigator.onLine)、SDK 版本等维度字段
可靠上报与降级策略
错误上报本身不能成为故障源:
- 使用
navigator.sendBeacon()发送日志,确保页面卸载时仍能发出(兼容性需检查 fallback) - 若 sendBeacon 不可用,退回到
new Image().src = url或fetch(..., { keepalive: true }) - 对高频错误(如 1 分钟内同类错误超 5 次)做采样或节流,防止日志风暴
- 本地 localStorage 缓存未发出的错误,下次页面打开时补报(注意大小限制和过期)
不复杂但容易忽略:异步错误追踪的关键不在“捕获”,而在“上下文完整”和“上报必达”。把 unhandledrejection + error 事件搭好,再补上 traceId 和轻量降级,就能覆盖绝大多数静默异常场景。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










