window.onerror不捕获promise拒绝错误,因其仅监听js运行时同步及异步任务(如settimeout、事件回调)抛出的错误,而promise.reject未被处理时触发的是独立的unhandledrejection事件,由微任务队列派发,与onerror的错误机制完全隔离。

为什么 window.onerror 不捕获 Promise 拒绝错误
直接写 window.onerror = () => {...} 只能捕获同步脚本错误、资源加载失败(如 JS 文件 404)等,但对 Promise.reject() 或未 await 的异常完全无感——浏览器把这类错误归为“unhandledrejection”,需要单独监听。
实际场景中,一个 fetch 失败没 catch,或组件里 useEffect 中的异步逻辑抛错,用户界面卡住却无提示,就是漏掉了这个监听点。
- 必须同时注册
window.addEventListener('error')和window.addEventListener('unhandledrejection') -
unhandledrejection的event.reason可能是 Error 实例,也可能是字符串或普通对象,需做类型判断 - 在现代打包环境下(如 Vite / Webpack),source map 未部署时,
error.filename常是 bundle.js,行号也失真,别依赖它定位源码
如何用 alert() 做最小可行错误提示(仅开发/测试用)
上线前快速验证监控是否生效,最直白方式就是弹 alert()。但它会中断执行流、阻塞后续 JS,**绝不能用于生产环境**。
示例代码可直接粘贴到 index.html 的 <script></script> 标签内:
window.addEventListener('error', event => {
alert(`JS Error: ${event.message}\n@ ${event.filename}:${event.lineno}`);
});
window.addEventListener('unhandledrejection', event => {
const reason = event.reason instanceof Error
? event.reason.message
: String(event.reason);
alert(`Promise Rejected: ${reason}`);
});
- 注意:两次
alert()会连续弹出,可能被浏览器拦截(尤其 Safari) - 若页面已引入框架(如 React),
event.filename多数时候是空字符串,得靠event.error?.stack辅助判断 - 这种写法不兼容 IE,但 IE 已无实际维护价值,无需降级
生产环境该用什么方式上报错误
真实项目里,错误要发到后端聚合服务(如 Sentry、LogRocket,或自建接口),而不是弹窗或 console。
关键约束条件:fetch 上报本身不能引发新错误,且需避免重复上报(比如一个错误触发 error + unhandledrejection 两次)。
- 上报前加防抖:用
setTimeout延迟 100ms,合并短时间内的同类错误 - 用
navigator.sendBeacon()替代fetch,确保页面卸载(如用户关闭标签页)时仍能发出请求 - 上报 payload 至少包含:
event.type('error' / 'unhandledrejection')、event.message、event.stack(如有)、location.href、navigator.userAgent - 禁止上报
event.error整个对象——它含函数引用,JSON.stringify 会静默丢弃,且可能泄漏敏感上下文
为什么 script 标签位置影响错误捕获范围
把监控脚本放在 最顶部,才能捕获后续所有 inline script 和外部 JS 加载过程中的语法错误(如 <script>const a = ;</script>)。
如果监控代码写在 底部,那么上面所有 JS 执行期间发生的错误,都已在监控挂载前丢失。
- 正确写法:
<script>...监控逻辑...</script> - 若使用模块化构建(如 Vite),确保入口 JS(如
main.ts)的第一行就注册监听,而非等 DOMContentLoaded 后 - 动态插入的 script(如广告 SDK、统计代码)仍可被捕获,前提是它们执行时监听器已存在
img.onerror)、哪些要聚类去重、以及怎么在不拖慢首屏的前提下完成采集与上报。这些细节往往藏在灰度发布后的日志里,而不是文档开头。前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











