javascript中无法在捕获阶段直接监听全局网络异常,因fetch等请求异常不触发dom事件流;资源加载失败(如img/script)的error事件支持捕获阶段监听,而fetch/axios异常需通过promise.catch或unhandledrejection全局钩子处理。

JavaScript 中无法在捕获阶段直接为全局网络异常(如 fetch 失败、资源加载失败)添加事件监听器,因为网络异常本身**不触发 DOM 事件流**,也就没有捕获/冒泡阶段的概念。所谓“捕获阶段捕获全局网络异常”是一个常见误解。
全局网络异常的类型和处理方式
需要区分两类主要的“网络相关异常”:
-
资源加载失败:如
<img>、<script></script>、<link>加载 404 或连接超时 —— 这类会触发error事件,且该事件支持捕获阶段; -
JS 发起的异步请求异常:如
fetch()、XMLHttpRequest的网络错误或响应异常 —— 这些是 Promise 拒绝或回调错误,不走 DOM 事件机制,因此与捕获阶段无关。
对资源加载失败:可用捕获式 error 监听
可在 document 或 window 上使用 { capture: true } 监听资源加载错误:
document.addEventListener('error', (e) => {
console.log('捕获到资源加载异常:', e.target);
// e.target 可能是 img/script/link 等元素
}, true); // true 表示捕获阶段
⚠️ 注意:该监听器只能捕获已挂载到 DOM 且发生加载失败的元素,且需在元素创建之前注册才可能捕获(因 error 事件会从目标向上冒泡,捕获阶段可提前拦截)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
对 fetch / axios 等请求异常:必须显式处理
这类异常完全在 JS 运行时发生,需靠代码逻辑捕获:
-
fetch()网络中断、DNS 失败等会拒绝 Promise,但4xx/5xx响应仍算“成功”,需手动检查response.ok; - 推荐封装统一请求函数,在内部
catch并上报; - 可结合
window.addEventListener('unhandledrejection')捕获未被catch的 Promise 拒绝(含 fetch 错误),但它不是捕获阶段,而是全局钩子:
window.addEventListener('unhandledrejection', (event) => {
if (event.reason?.name === 'TypeError' && event.reason.message.includes('fetch')) {
console.warn('未处理的 fetch 异常:', event.reason);
}
});
补充:监听全局网络状态变化(非异常,但相关)
可用 navigator.onLine 配合 online/offline 事件感知网络连通性变化:
window.addEventListener('offline', () => {
console.log('设备已离线');
});
window.addEventListener('online', () => {
console.log('设备已恢复在线');
});
注意:该事件仅反映系统级网络状态,不能替代具体请求的错误处理。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










