fetch异常需分网络级失败和http状态错误两类处理:前者用try/catch捕获typeerror/aborterror,后者须检查response.ok并手动处理;结合abortcontroller可防超时卡死。

Fetch 捕获网络请求异常,关键在于区分两类错误:**网络级失败**(如断网、DNS 解析失败、CORS 被拒、请求被中止)和 **HTTP 状态错误**(如 404、500)。前者会直接 reject Promise,后者仍返回 Response 对象,需手动检查。只靠 .catch() 或未检查 response.ok,会漏掉大量真实错误。
用 try/catch + await 统一捕获网络异常
网络异常(例如用户断网、服务不可达、fetch 被 AbortController 中止)会抛出 TypeError 或 AbortError,必须用 try/catch 包裹 await fetch() 才能捕获:
- 不 await 的 Promise.reject() 不会被外层 catch 捕获
- 直接链式调用
.then().catch()只能捕获网络异常,无法覆盖 4xx/5xx 响应 - 推荐始终使用 async/await 结构,让错误流集中可控
手动检查 response.ok 处理 HTTP 错误
服务器返回 400、500 等状态码时,fetch 仍 resolve,response.ok 为 false。必须显式判断,否则逻辑会继续执行:
-
response.ok等价于response.status >= 200 && response.status - 若
!res.ok,可调用res.text()安全读取错误体(JSON/HTML/纯文本都适用) - 避免对错误响应直接调用
res.json(),否则非 JSON 内容会触发新异常
结合 AbortController 防止请求卡死
原生 fetch 没有超时机制。长期无响应会阻塞 UI,需主动控制:
- 创建
AbortController实例,把signal传入 fetch 选项 - 用
setTimeout在指定毫秒后调用controller.abort() - 中止时抛出的
AbortError可在 catch 中识别并重试或提示
完整健壮写法示例
以下函数同时覆盖网络异常、HTTP 错误、超时中止,并提取可用错误信息:
async function safeFetch(url, options = {}) {<br> const controller = new AbortController();<br> const timeout = setTimeout(() => controller.abort(), 8000);<br> try {<br> const res = await fetch(url, { ...options, signal: controller.signal });<br> if (!res.ok) {<br> const errorText = await res.text();<br> throw new Error(`HTTP ${res.status}: ${errorText}`);<br> }<br> return await res.json();<br> } catch (err) {<br> if (err.name === 'AbortError') {<br> throw new Error('请求超时,请检查网络');<br> }<br> throw err;<br> } finally {<br> clearTimeout(timeout);<br> }<br>}Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











