async错误必须主动拦截、结构化上报、分级处理,否则易静默失败;需在顶层try-catch中注入函数名、参数、调用位置和errorid,兜底监听unhandledrejection事件,统一转为error对象,并设计含type、context、stack、level的结构化日志,配合防刷降噪策略。

async 错误不能靠“等它自己冒出来”,必须主动拦截、结构化上报、分级处理,否则容易静默失败,监控失灵。
顶层 try-catch + 上下文注入
每个用户可触发的 async 入口(如按钮点击、表单提交、路由守卫)都应包裹 try-catch,并在捕获时注入关键上下文:
- 记录 函数名、简要参数(如
{ userId: 'abc123', action: 'submit-form' }),避免日志中只有空泛的 “TypeError” - 补充 调用位置(
new Error().stack截取前两行,或用error.stack.split('\n')[1]提取文件行号) - 生成唯一 errorId(如
crypto.randomUUID()),便于前后端链路对齐
兜底监听 unhandledrejection
Promise 拒绝若未被任何 .catch() 或 await+try 捕获,会触发 unhandledrejection 事件——这是最后防线:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 全局监听一次即可:
window.addEventListener('unhandledrejection', e => { logError(e.reason, 'unhandled-rejection'); }); - 注意:e.reason 可能是 Error 实例,也可能是原始值(如字符串、数字),上报前需统一转为 Error 对象以便提取 stack
- 该事件不替代顶层捕获,仅用于发现遗漏路径,避免错误完全丢失
结构化字段设计
日志不是记一句话,而是为排查留线索。建议至少包含:
-
type:标明错误来源(
'fetch-fail'、'parse-json-error'、'timeout') -
context:含环境(
env: 'prod')、用户标识哈希(uid: 'a3f9b…')、触发动作(action: 'click-pay-btn') - stack:保留原始堆栈,但过滤 node_modules 路径和敏感字段(如 token、手机号)
-
level:按影响分级(
error/warn/info),决定是否告警或计入错误率
防刷与降噪策略
高频操作(如搜索输入、滚动加载)若每错必报,会淹没真实问题:
- 对相同 stack hash 做时间窗口去重(如 5 分钟内只上报首次)
- 非关键错误暂存 localStorage,待页面空闲或刷新后批量上报
- 序列化前检测循环引用,用安全 clone(如
structuredClone或自定义浅拷贝逻辑) - 连续 3 次同一 errorId 出现,自动触发堆栈快照采样,辅助定位偶发问题
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










