能被 window.onerror 捕获的前提是:同源或跨域脚本需同时满足 crossorigin 属性 + 服务端 access-control-allow-origin 响应头,否则仅得“script error.”。

<script></script> 标签引入的脚本,只要不是跨域加载且未开启 CORS 保护,其运行时异常(如 ReferenceError、TypeError)默认就能被 window.onerror 捕获。
但实际中常因配置缺失或环境限制导致捕获失败。关键不在“能不能”,而在于“怎么配对”。
✅ 正确引入 + 可捕获的前提条件
- 脚本必须是同源,或满足跨域捕获条件
-
<script></script>标签需添加crossorigin属性 - 服务端响应头必须包含
Access-Control-Allow-Origin: *(或具体域名) - 脚本需同步执行或正常解析执行(非动态
eval、非innerHTML注入、非沙箱 iframe 内)
满足以上,window.onerror 就能拿到完整错误信息:message、source(即该 script 的 URL)、lineno、colno、error.stack
⚠️ 常见捕获失败原因及修复方式
跨域脚本没加
crossorigin
❌ 错误写法:<script src="https://cdn.example.com/app.js"></script>
✅ 正确写法:<script crossorigin src="https://cdn.example.com/app.js"></script>
→ 否则只收到"Script error.",行号列号全为 0,error为 nullCDN 未配 CORS 响应头
即使加了crossorigin,若服务端没返回Access-Control-Allow-Origin,浏览器仍屏蔽详细错误
→ 需协调 CDN 或自建静态资源服务,补全响应头脚本是异步加载但未标记
crossoriginasync或defer不影响onerror捕获能力,但必须带crossorigin才能获取明细
✅ 示例:<script async crossorigin src="..."></script>脚本内错误被 try/catch 拦截了
window.onerror不捕获已被 catch 的错误
→ 若想统一上报,需在 catch 中手动调用上报函数,不能依赖全局监听
? 补充建议:增强捕获鲁棒性
同时监听
window.addEventListener('error')
它可捕获资源加载失败(如 404 的 script),但对 JS 运行时错误作用与onerror类似,可作为兜底补充-
对第三方脚本,可单独加
onerror属性做快速降级<script src="https://thirdparty.com/sdk.js" onerror="console.warn('SDK load failed'); initFallbackSDK();"> </script> 错误上报时务必带上
source字段
它能明确区分是业务代码、监控 SDK 还是广告脚本出的问题,避免误判
本质上,<script></script> 引入的脚本异常捕获不复杂,但容易忽略 crossorigin 和服务端头的配合。配对到位,window.onerror 就是最轻量、最有效的全局运行时异常入口。











