JavaScript 的 error 和 unhandledrejection 事件不参与 DOM 事件流,只能在 window 上监听,无捕获/冒泡行为;useCapture 参数无效,且无法通过 document 或 iframe 父级兜底监听。

在 JavaScript 中,事件捕获与冒泡是 DOM 事件传播的两个阶段,但它们**不适用于错误事件(如 `error`、`unhandledrejection`)**。全局错误捕获与 DOM 事件流无关,不能通过 `window.addEventListener('error', ..., true)` 这类方式用“捕获阶段”来监听未捕获的运行时错误。
全局错误捕获靠专用事件,不是 DOM 冒泡/捕获
浏览器提供了专门用于捕获未处理错误的全局事件接口,和 DOM 事件传播机制完全独立:
-
`window.addEventListener('error')`:捕获同步脚本错误(如语法错误、引用错误、资源加载失败等),但仅对未被 try/catch 捕获的错误生效;它默认在冒泡阶段触发,设置
useCapture = true无效(该事件不参与 DOM 事件流)。 -
`window.addEventListener('unhandledrejection')`:捕获未被
.catch()或try/catch await处理的 Promise 拒绝。 - 两者都只能在
window(或self)上监听,且没有捕获/冒泡行为——它们就是纯通知型事件。
正确监听全局错误的写法
直接绑定到 window,无需关心 useCapture 参数:
在调试 Java 后端 API 故障时使用此技能,尤其适用于以下任务:分析日志、跨 Controller、Service 和 Mapper 层追踪请求、定位异常根因、检查 SQL 执行或参数流转,以及生成简洁的诊断结论与修复方案。
window.addEventListener('error', (event) => {
console.error('JS Error:', {
message: event.message,
filename: event.filename,
lineno: event.lineno,
colno: event.colno,
error: event.error // 可能为 null(如资源加载错误)
});
});
window.addEventListener('unhandledrejection', (event) => {
console.error('Unhandled Rejection:', {
reason: event.reason,
promise: event.promise
});
event.preventDefault(); // 阻止默认控制台警告(可选)
});
注意边界情况
-
静态资源加载错误(如 img、script 404)会触发
error事件,但event.error通常为null,需依赖event.target判断来源。 -
跨域脚本错误(如 CDN 上的 JS 报错)受同源策略限制,
message、lineno等字段会被屏蔽为"Script error.",需配置crossorigin属性并确保服务端返回Access-Control-Allow-Origin。 -
iframe 内错误不会自动冒泡到父页面
window,需在 iframe 的contentWindow上单独监听(且受同源限制)。
不推荐用 try/catch 包裹整个 script
无法用 DOM 事件机制“兜底”所有错误,也不能靠监听 document 或 body 的捕获事件来替代 window.error。试图在非 window 对象上监听这些错误事件无效。
立即学习“Java免费学习笔记(深入)”;


















