fetch 默认仅在网络失败时拒绝 promise,需手动检查 response.ok 或 status 处理 400/500 等 http 错误;推荐先判断 response.ok 再解析响应内容。

Fetch 默认不会因为 HTTP 状态码(比如 400、500)而抛出错误,它只在**网络失败**(如断网、DNS 失败、请求被取消)时拒绝 Promise。所以服务器返回的错误文本(例如 400 Bad Request 带 JSON 错误信息,或 500 Internal Server Error 返回 HTML/纯文本),需要你手动检查 response.ok 或 response.status 才能捕获并处理。
判断响应是否成功再解析内容
最常用也最推荐的方式:先用 response.ok(等价于 status >= 200 && status )判断,再决定是否调用 <code>.json()、.text() 等方法解析响应体:
- 如果
response.ok === false,说明是客户端或服务端错误(4xx/5xx),此时仍可调用response.text()获取错误文本 - 避免直接对错误响应调用
.json(),否则可能因非 JSON 内容(如 HTML 错误页)导致解析失败抛异常
统一提取错误文本内容
不管返回的是 JSON、纯文本还是 HTML,都可以用 response.text() 安全读取原始内容,再按需处理:
-
await response.text()总是能拿到字符串,适合展示给用户或记录日志 - 若预期错误响应是 JSON(如
{"error": "Invalid email"}),可尝试try/catch解析,失败则回退到原始文本 - 注意:不要在
catch中重复读取响应体——response.body只能读一次
结合 async/await 的典型写法
一个健壮的 fetch 请求示例:
async function apiCall(url) {
try {
const res = await fetch(url);
if (!res.ok) {
const errorText = await res.text(); // 读取错误响应体
throw new Error(`HTTP ${res.status}: ${errorText}`);
}
return await res.json(); // 正常情况解析 JSON
} catch (err) {
console.error('请求失败:', err.message);
throw err;
}
}
处理常见错误格式
实际项目中,后端错误响应格式各异,可按需适配:
- JSON 错误:检查
res.headers.get('content-type')?.includes('json'),再JSON.parse(errorText) - 纯文本错误(如 Nginx 50x 页面):直接显示
errorText.substring(0, 200)防止过长 - HTML 错误页:用
DOMParser提取<title></title>或<h1></h1>内容,提升可读性
不复杂但容易忽略:fetch 的“错误”和“失败”是两回事,得自己把状态码这关守好。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











