You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同域名调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 11:15:03