fetch api 不会因 http 错误状态码自动 reject,仅网络失败时 reject;需手动检查 response.ok 并结合 try/catch 区分网络错误与 http 错误,推荐封装 fetchwithstatus 统一处理。

Fetch API 本身不会因 HTTP 状态码(比如 404、500)自动抛出错误,只有在网络完全失败(如 DNS 失败、请求被中止、无网络)时才 reject。因此,处理异常和错误需要手动检查 response.ok 或 response.status,再配合 try/catch 捕获底层网络错误。
区分网络错误与 HTTP 错误
这是最关键的一步:fetch 返回的 Promise 只在“请求根本没发出去”时 reject(例如域名无法解析、跨域被拦截、离线)。而服务端返回 4xx/5xx 响应时,Promise 仍 resolve,只是 response.ok === false。
-
网络错误:进入
catch块,error是TypeError或AbortError等 -
HTTP 错误(如 404、500):进入
then,需主动判断!response.ok并 throw 自定义错误
统一处理响应状态
推荐封装一个工具函数,在拿到 response 后立即校验状态,把 HTTP 错误转为可捕获的异常:
async function fetchWithStatus(url, options = {}) {
const res = await fetch(url, options);
if (!res.ok) {
const error = new Error(`HTTP ${res.status} ${res.statusText}`);
error.response = res; // 保留原始 response,方便后续读取 body
throw error;
}
return res;
}
这样后续链式调用就能统一用 catch 捕获所有错误(网络 + HTTP)。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
安全读取响应体并提供上下文信息
错误发生时,常需知道后端返回的具体提示(如 JSON 中的 message 字段)。但注意:response.json() 也可能失败(非 JSON 响应),且不能重复读取 body。
- 先用
response.clone().json()安全尝试解析错误体 - 捕获解析失败,降级使用
response.text() - 把原始 URL、请求方法、状态码一并记入错误对象,便于调试
添加超时与取消能力
原生 fetch 不支持超时,但可通过 AbortController 实现请求取消,再结合 Promise.race 模拟超时:
function fetchWithTimeout(url, options = {}, timeout = 8000) {
const controller = new AbortController();
const id = setTimeout(() => controller.abort(), timeout);
return fetch(url, { ...options, signal: controller.signal })
.finally(() => clearTimeout(id));
}
超时会触发 AbortError,可在 catch 中识别并提示“请求超时”。
不复杂但容易忽略:别只依赖 try/catch,一定要检查 response.ok;错误处理不是补丁,而是请求流程的必要环节。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










