You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React Native中Fetch API如何在转JSON前校验HTTP状态码

处理AJAX请求中的HTTP状态码校验(不挤占catch的异常处理空间)

这个场景我太熟悉了——之前做项目时也踩过把HTTP错误和系统异常混在catch里的坑,既不好区分处理,还给用户的提示也模糊。分享几个实用的方案,完美满足你“保留catch处理未预期异常,同时精准处理状态码”的需求:

方案1:利用response.ok快速判断状态范围

浏览器的Fetch API提供了response.ok属性,当HTTP状态码在200-299之间时会返回true,否则为false。我们可以在第一个then里先做这个判断,把非2xx的状态单独处理,再决定是否转JSON:

fetch('your-api-endpoint')
  .then(response => {
    if (!response.ok) {
      // 先尝试获取后端返回的错误文本(如果有的话)
      return response.text().then(errorContent => {
        // 抛出包含状态码和错误信息的自定义错误
        throw new Error(`HTTP ${response.status}: ${errorContent || '未返回错误详情'}`);
      }).catch(() => {
        // 如果后端没返回任何文本(比如401直接跳转前的空响应),直接抛状态码相关错误
        throw new Error(`请求失败:状态码 ${response.status}`);
      });
    }
    // 状态正常,转为JSON数据继续处理
    return response.json();
  })
  .then(parsedData => {
    // 处理正常返回的业务数据
    console.log('获取数据成功:', parsedData);
  })
  .catch(error => {
    // 这里只处理两类异常:
    // 1. 上面抛出的HTTP状态相关错误
    // 2. 网络错误、JSON解析失败等未预期的系统异常
    if (error.message.startsWith('HTTP') || error.message.includes('状态码')) {
      // 给用户展示精准的业务错误提示
      alert(`请求出错:${error.message}`);
    } else {
      // 处理系统级异常,比如断网、JSON格式错误
      alert('请求失败,请检查网络连接或稍后重试');
      console.error('未预期的异常:', error);
    }
  });

方案2:针对特定状态码做精细化处理

如果需要对401(未授权)、403(无权限)、400(参数错误)等特定状态码做不同的用户提示,可以直接判断response.status,做更细粒度的处理:

fetch('your-api-endpoint')
  .then(response => {
    switch (response.status) {
      // 正常状态,直接转JSON
      case 200:
      case 201:
        return response.json();
      // 未授权,提示用户重新登录
      case 401:
        throw new Error('登录已过期,请重新登录');
      // 无权限,提示用户权限不足
      case 403:
        throw new Error('您没有权限执行此操作');
      // 资源不存在,提示用户检查请求
      case 404:
        throw new Error('请求的资源不存在');
      // 参数错误,尝试解析后端返回的错误详情
      case 400:
        return response.json().then(errorData => {
          throw new Error(`参数错误:${errorData.msg || '请检查输入内容'}`);
        }).catch(() => {
          throw new Error('参数错误,请检查输入内容');
        });
      // 其他非2xx状态,统一处理
      default:
        return response.text().then(errorText => {
          throw new Error(`请求错误 ${response.status}: ${errorText || '未知错误'}`);
        });
    }
  })
  .then(parsedData => {
    // 处理正常数据
    console.log('数据:', parsedData);
  })
  .catch(error => {
    // 统一展示用户友好的提示
    alert(error.message);
    // 对未预期的异常(比如网络错误)记录日志
    if (!['登录已过期', '您没有权限', '参数错误', '资源不存在'].includes(error.message)) {
      console.error('系统异常:', error);
    }
  });

核心思路

把HTTP状态码的业务错误在第一个then中就通过throw抛出,这样catch块只需要负责处理系统级异常(比如网络断开、JSON解析失败),既能给用户展示精准的错误提示,又不会让catch块变得臃肿混乱。

内容的提问来源于stack exchange,提问作者VK321

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:20:44