Ajax请求非200状态码需区分网络错误与服务端错误:fetch用response.ok判断并配合status处理4xx/5xx,XMLHttpRequest需校验readyState===4且status在200–299间。

Ajax请求遇到HTTP状态码非200(比如400、401、403、404、500等)时,不能只依赖catch或error回调来捕获——因为fetch默认不会因HTTP错误状态(如404/500)抛出异常,XMLHttpRequest也需手动判断status。关键在于:区分网络错误(如断网、跨域失败)和业务/服务端错误(如401未登录、403无权限),并针对性处理。
fetch中正确判断和响应非200状态
fetch的response.ok是判断是否为成功HTTP响应(即status在200–299之间)的最简方式;仅靠catch会漏掉4xx/5xx响应:
- 先检查
response.ok === false,再用response.status获取具体状态码 - 对401(未授权)可触发登出或跳转登录页;403(禁止访问)提示权限不足;404可显示友好提示而非报错
- 用
response.json()或response.text()读取服务端返回的错误详情(如{ "message": "Token expired" })
XMLHttpRequest中别忽略readyState和status校验
XMLHttpRequest需同时满足readyState === 4(请求完成)且status >= 200 && status 才算成功,否则属于HTTP异常:
- 不要只监听
onerror——它只捕获网络层错误(如DNS失败、连接中断),不触发404/500 - 在
onload里统一判断xhr.status,再根据状态码做不同处理 - 例如:status为0且
responseText为空,大概率是跨域被拦截或CORS配置问题
统一错误处理建议:封装成可复用逻辑
避免每个请求都重复写状态码判断,推荐在请求封装层集中处理:
立即学习“Java免费学习笔记(深入)”;
- 定义常见状态码映射表,如
{ 401: '请重新登录', 403: '权限不足', 500: '服务暂时不可用' } - 对401/403等需用户干预的状态,自动触发全局事件(如
dispatchEvent(new CustomEvent('auth-error'))) - 记录非200响应到监控系统(含URL、method、status、耗时),便于后端排查
注意浏览器对某些状态码的特殊行为
部分状态码会被浏览器静默处理或限制访问响应内容:
- 401响应若含
WWW-Authenticate头,部分浏览器可能弹出认证框(非预期),建议后端改用403或自定义头 - 跨域请求下,除非服务端明确允许(
Access-Control-Expose-Headers: X-Error-Code),否则无法读取自定义错误头 - 重定向(301/302)默认由fetch自动跟随,如需手动控制,设
redirect: 'manual'
不复杂但容易忽略——核心就两点:主动检查HTTP状态码,按语义分类处理,而不是把所有非200都当“失败”弹框了事。


















