Fetch 默认不因 HTTP 状态码错误 reject,仅网络失败时 reject;需用 response.ok 或 status 判断业务错误并手动 throw,配合 try/catch 分层捕获网络异常与 HTTP 错误。

Fetch 默认不会因 HTTP 状态码(如 404、500)抛出错误,它只在网络失败(如断网、DNS 失败)时 reject。所以处理状态码和业务错误需要手动检查 response.ok 或 response.status,再配合 try/catch 捕获网络异常。
判断 HTTP 状态码并主动抛错
Fetch 返回的 Response 对象有 ok 属性(true 表示状态码在 200–299),也有 status 和 statusText 可读取具体值。推荐在 await response.json() 前检查状态,避免解析失败的响应体:
- 用
if (!response.ok)快速拦截非成功响应 - 根据
response.status做差异化处理(如 401 跳登录,403 提示无权限) - 手动
throw new Error(`${response.status} ${response.statusText}`)让后续catch统一处理
正确捕获两类错误:网络错误 & 业务错误
Fetch 的 Promise 只在请求根本发不出去时 reject(比如离线、跨域被拦、URL 无效),而 4xx/5xx 属于“请求已发出且收到响应”,此时 Promise 仍 resolve。因此必须分两层处理:
-
外层 try/catch:捕获网络异常(如
TypeError: Failed to fetch) - 内层 if/throw:对已返回的 Response 判断状态,把业务错误转为异常
这样能确保所有错误都进入同一个 catch 块,便于统一提示或日志上报。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
避免常见陷阱:.json() 报错与空响应体
response.json() 本身会 reject(比如返回空内容、非 JSON 格式),但它不关心状态码。所以别直接链式调用 fetch(...).then(r => r.json()),否则 404 响应带 HTML 错误页时会因解析失败报错,掩盖了原始状态信息:
- 先
await response.json(),再检查response.ok—— 不推荐,JSON 解析可能提前失败 - 先检查
response.ok或response.status,再决定是否解析 —— 更安全 - 对可能为空或非 JSON 的接口,用
response.text()替代json(),再手动JSON.parse并加try/catch
完整示例:带状态判断与错误统一处理
(可直接复用的模板)
async function apiGet(url) {
try {
const res = await fetch(url);
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
}
return await res.json();
} catch (err) {
if (err.name === 'TypeError' && err.message.includes('fetch')) {
throw new Error('网络异常,请检查网络连接');
}
throw err; // 保留原始错误(含 4xx/5xx 信息)
}
}
// 使用
apiGet('/api/user')
.then(data => console.log(data))
.catch(err => alert(err.message));

















