javascript中ajax全局错误捕获需分层设计:用unhandledrejection捕获未处理的promise拒绝(如fetch失败),用window.onerror捕获脚本加载及同步阶段错误,再通过统一请求封装实现业务级错误分类与处理。

JavaScript 中 Ajax 的全局错误异常捕获不能靠单个 try-catch 实现,因为原生 fetch 和 jQuery 的 $.ajax 都是异步操作,错误发生在回调或 Promise 链中,不会冒泡到外层同步执行栈。真正有效的全局兜底需分层设计:既覆盖未处理的网络/响应错误,也拦截未被捕获的 Promise 拒绝。
用 window.addEventListener('unhandledrejection') 捕获 Promise 类 Ajax 错误
现代 Ajax(如 fetch)返回 Promise,若拒绝后没被 .catch() 或 await + try-catch 处理,会触发 unhandledrejection 事件。这是捕获“静默失败”的关键兜底:
- 监听该事件,可统一记录日志、上报监控、提示用户
- 调用
event.preventDefault()可阻止浏览器默认的控制台报错红字(但不推荐完全屏蔽,建议仅用于自定义处理) - 注意:它只捕获未处理的 Promise 拒绝,对
fetch成功但业务返回错误码(如 401、500)无效——这类需在业务逻辑中判断并throw
用 window.onerror 捕获脚本加载与同步阶段错误
window.onerror 主要捕获三类问题,部分与 Ajax 相关:
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
- Ajax 请求发起前的错误:比如
XMLHttpRequest构造失败、URL 语法错误、CORS 预检失败(部分浏览器会触发) - jQuery
$.ajax的error回调里抛出的同步异常(例如解析responseText时JSON.parse报错) - 脚本加载失败(
<script src="xxx"></script>404)——间接影响 Ajax 依赖的库
它无法捕获 Promise 异步拒绝,也不能拿到 fetch 的 TypeError: Failed to fetch(该错误属于 Promise 拒绝,归 unhandledrejection 管)。
对 fetch / axios 做统一请求封装,内置错误分类处理
真正的“全局”控制不在监听器,而在请求入口。封装一个 request 函数,强制所有 Ajax 走这里:
- 自动检查
response.ok,非 2xx 主动throw new Error(`${res.status} ${res.statusText}`) - 对
res.json()等解析操作加try-catch,把SyntaxError转为业务可识别错误 - 根据错误类型(网络断开、超时、服务端错误、客户端解析失败)分发不同提示或重试策略
- 内部统一调用
console.error或 SDK 上报,避免散落各处
jQuery 用户可用 $.ajaxSetup 配置全局 error 回调
jQuery 提供了更直接的方案:$.ajaxSetup({ error: handler }) 可为所有 $.ajax 请求设置默认错误处理:
- 该回调在请求失败(状态码非 2xx/3xx、网络中断、超时等)时触发,参数含
XMLHttpRequest对象,可读取status、statusText、responseText - 适合统一处理登录过期(跳转登录页)、限流提示、离线降级等场景
- 注意:它不替代单个请求的
error回调,而是作为兜底;若某次请求已定义error,则优先执行该次的
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










