同域名调用Ajax时window.onerror上报“Script error”问题如何解决?
问题解答
核心结论
该"Script error"确实和错误发生在Deferred(jQuery ajax的异步回调,类Promise实现)内部直接相关,并非CORS导致,具体原因和规避方案如下:
问题原因
- jQuery的旧版Deferred实现会在执行.done/.fail回调时主动包裹try/catch,二次抛出内部异常时会丢失原始错误的调用栈、类型信息,浏览器无法读取到完整错误详情,就会返回通用的"Script error"。
- 符合Promise A+规范的异步回调内部的未处理异常,默认不会触发window.onerror,而是会触发全局
unhandledrejection事件,仅监听window.onerror的话,要么拿不到错误,要么只能拿到被抹平后的错误信息。
规避方案
- 优先在业务逻辑层主动捕获异常,在JSON.parse外层增加try/catch逻辑,直接拿到完整错误信息,同时兼容空响应场景,示例代码:
.done(function(response) { var incoming; try { // 空响应默认传入空对象的JSON字符串,也可以根据业务需求自定义兜底逻辑 incoming = JSON.parse(response || '{}'); } catch (err) { // 此处可直接上报完整错误信息 console.error('JSON解析失败', err); return; } // 后续正常业务逻辑 })
- 补充监听全局
unhandledrejection事件,捕获所有未处理的Promise类异步异常,示例代码:
window.addEventListener('unhandledrejection', function(e) { // e.reason 为原始错误对象,包含完整的SyntaxError报错信息 console.error('未捕获的异步异常', e.reason); // 按需做错误上报 e.preventDefault(); })
- 升级jQuery到3.0及以上版本,新版本调整了Deferred的异常抛出逻辑,会保留原始错误的完整信息,同域场景下不会再被抹为通用Script error。
- 接口侧增加兜底逻辑,就算无返回数据也输出合法JSON结构(如
{}),从源头上避免JSON.parse报错。
内容的提问来源于stack exchange,提问作者magnol
相关产品推荐
相关产品推荐

