async/await异常需主动上报,必须用try/catch捕获并调用SDK reportError;高风险操作须包裹;Promise.all推荐改用allSettled以避免失败掩盖;未捕获拒绝需兜底监听unhandledrejection并标准化reason;上报须含页面路径、用户ID、业务状态等上下文。

async/await 本身不自动上报错误,必须主动与前端异常监控系统配合,才能确保所有异步异常被采集、归因和告警。
关键异常必须显式捕获并上报
await 表达式抛出的异常不会自动触发全局 error 监听器,也不会进入 unhandledrejection 队列(除非完全未处理)。因此,仅靠 window.addEventListener('error') 或 window.addEventListener('unhandledrejection') 是不够的。
- 每个 await 调用都应处于 try/catch 块中,catch 内需调用监控 SDK 的 reportError 方法(含堆栈、URL、用户 ID、上下文等字段)
- 避免只 console.error:日志不上传,无法聚合分析,也无法触发告警
- 对 fetch、JSON.parse、第三方 SDK 调用等高风险操作,尤其要包裹——例如 await response.json() 可能因响应体非 JSON 而抛错,常被忽略
Promise.all 等并行场景需区分失败粒度
Promise.all 拒绝时只返回第一个 rejection,掩盖其余失败;Promise.allSettled 则保留全部结果,更适合监控。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 优先使用 Promise.allSettled + 显式遍历 rejected 结果,逐条上报,避免“一个失败全盘丢失”
- 若仍用 Promise.all,应在 catch 中补充日志:记录哪些子请求已发出、哪些尚未响应、是否超时,辅助定位网络或服务问题
- 上报时带上 operationName(如 "loadUserProfileAndCart"),便于在监控平台按业务维度下钻分析
未被捕获的 Promise 拒绝必须兜底监听
即使写了 try/catch,仍有遗漏可能:比如事件回调中 await、定时器触发的 async 函数、或第三方库内部的异步链。
立即学习“前端免费学习笔记(深入)”;
- 务必注册 window.addEventListener('unhandledrejection', e => { reportError(e.reason, { type: 'unhandledrejection' }); })
- 注意:e.reason 可能是 Error 实例,也可能是字符串或普通对象,上报前需 normalize(提取 message、stack、name)
- 配合 source map 解析原始堆栈,否则压缩后的代码堆栈无调试价值
监控数据需携带可追溯的业务上下文
单纯错误堆栈无法判断影响范围。上报时至少补充三项信息:
- 页面路径与路由参数:区分是 /login 还是 /checkout 报错
- 用户会话标识:如 uid 或匿名 sessionId,支持关联多设备行为
- 关键业务状态:例如 paymentStep: 'submitting'、cartSize: 3,帮助复现场景

















