fetch不能单靠catch捕获http错误,因404/500等状态码仍走then分支;必须检查response.ok(等价于200–299)或response.status,手动throw错误才能触发重试或统一处理。

fetch 请求失败时,不能单靠 catch 捕获所有错误,因为网络通但响应状态码异常(如 404、500)时,fetch 仍会进入 then,不会触发 catch。判断状态码的关键是检查 response.ok 或 response.status。
用 response.ok 判断是否成功
response.ok 是一个布尔值,当状态码在 200–299 范围内时为 true,否则为 false。这是最简洁的判断方式:
- ✅ 推荐用于快速区分“业务成功”与“服务端报错”
- ❌ 注意:它不区分 401 和 500,都返回
false - 示例:if (!res.ok) throw new Error(`HTTP ${res.status}`);
手动检查 response.status 码范围
若需对不同状态码做差异化处理(比如重试 503、跳转登录页 401),应直接读取 response.status:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
- ✅ 可精确处理 400、401、403、404、500、502 等常见码
- ⚠️ 注意:status 值是数字,不是字符串;且 fetch 不会因 status 非 2xx 抛错
- 示例:if (res.status === 401) window.location.href = '/login';
区分网络错误和 HTTP 错误
真正“请求失败”的场景分两类,需分别捕获:
- ? 网络层失败(如 DNS 失败、连接超时、服务器无响应)→ 进入
catch - ? 网络成功但服务端返回错误状态码(如 404)→ 进入
then,需手动检查ok或status - 建议结构:fetch().then(res => { if (!res.ok) throw res; return res.json(); }).catch(err => { /* err 可能是 NetworkError 或 Response 实例 */ });
获取完整错误信息的小技巧
想同时拿到状态码、状态文本和响应体内容(比如后端返回的 error message),可这样处理:
- 调用
res.clone().json()或res.text()获取 body 内容(注意只能读一次,需 clone) - 组合信息抛出自定义错误:throw new Error(`${res.status} ${res.statusText}: ${await res.text()}`);
- 避免在未检查
ok前直接调用res.json(),否则 404 响应体可能不是合法 JSON,导致解析报错掩盖原始状态码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










