fetch 不在 4xx/5xx 时自动报错,仅网络异常会 reject;需手动检查 response.ok,否则 HTTP 错误将被忽略。async/await + try/catch 可统一处理网络与 HTTP 错误,建议在 !res.ok 分支中解析 JSON 获取后端错误详情。

fetch 不会在 4xx 或 5xx 状态码时自动报错,它只在真正“连不上”(如断网、DNS 失败、CORS 被拦)时 reject。所以必须手动检查响应状态,否则 500 错误会悄无声息地进入正常流程。
区分网络错误和 HTTP 错误
网络错误(如地址无效、离线、跨域拒绝)会触发 catch;而服务器返回 404、500、401 等,fetch 仍 resolve,并给出一个 Response 对象——此时 response.ok === false,response.status 是对应数字。
- ✅
catch只捕获:TypeError、AbortError、NetworkError 等底层失败 - ❌
catch不捕获:400、401、403、429、500、502 等任何 HTTP 错误状态
统一用 async/await + try/catch 处理
比链式 .then().catch() 更清晰,能把网络错误和 HTTP 错误都收进同一个 catch 块里。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 先 await fetch,拿到 response
- 立刻检查
!response.ok,是则throw new Error(...) - 再解析 body(如
response.json()),它也可能出错(比如返回非 JSON 内容)
async function apiCall(url) {
try {
const res = await fetch(url);
if (!res.ok) {
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
}
return await res.json();
} catch (err) {
console.error('请求失败', err);
throw err;
}
}
按状态码做差异化处理
单纯抛错不够友好。常见状态可提前分支处理,比如跳登录页、提示限频、展示后端返回的错误消息。
立即学习“Java免费学习笔记(深入)”;
- 401 / 403 → 清除 token,跳转登录页或弹权限提示
- 429 → 显示“操作太频繁”,并禁用按钮几秒
- 400 / 404 → 解析后端返回的 error 字段,显示具体提示(需
res.json()后读取) - 5xx → 提示“服务异常,请稍后重试”,避免暴露后端细节
注意响应体里的真实错误信息
statusText(如 "Internal Server Error")是标准描述,不包含后端自定义内容。要拿到详细错误,得等 res.json() 或 res.text() 后读取 body:
- 即使 500,只要服务器返回了 JSON 格式的
{"message": "库存不足"},就能提取出来展示 - 建议在
!res.ok分支里也调用res.json()(并加 try/catch 防解析失败)

















