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

Axios拦截器错误处理如何同时兼容Promise语法与await try/catch

Axios拦截器错误处理的兼容性说明

两种错误抛出写法天然等价

在Axios响应拦截器的错误回调中,throw 错误对象 和 return Promise.reject(错误对象) 效果完全一致,天生同时支持Promise链式调用的.catch()捕获和await + try/catch捕获两种语法,不存在只能支持其中一种的情况。

你之前使用Promise.reject时react-query无法正常运行,大概率是漏写了return关键字:如果直接执行Promise.reject(error)而不返回,拦截器错误回调会默认返回undefined,相当于错误被静默吞掉,自然无法被后续逻辑捕获。

两种正确的拦截器写法

你当前的throw写法(完全没问题)

API.instance.interceptors.response.use(
  response => response,
  error => {
    const modifiedError = error;
    let errorMessage = t('common:common-front-end-error') || 'Something wrong happened, please, try later';
    if (error.response?.data?.payload) {
      errorMessage = error.response.data.payload;
    }
    modifiedError.message = errorMessage;
    throw modifiedError;
  }
);

Promise.reject写法(注意加return)

API.instance.interceptors.response.use(
  response => response,
  error => {
    let errorMessage = t('common:common-front-end-error') || 'Something wrong happened, please, try later';
    if (error.response?.data?.payload) {
      errorMessage = error.response.data.payload;
    }
    error.message = errorMessage;
    // 必须加return,否则错误会被吞
    return Promise.reject(error);
  }
);

React-query代码优化建议

你当前的请求函数中,catch块内重新创建Error实例的操作会丢失原错误的其他字段(比如HTTP状态码、请求配置、响应原始内容等),如果需要保留完整错误信息给react-query做后续处理,可以直接抛出捕获到的错误即可:

const fetchBlabla = currentPage => async (): Promise<Blabla> => {
  try {
    const api = API.getInstance();
    // 注意原路径参数拼接错误:第一个参数前缀应该是?而非&
    const response = await api.get<Blabla>(
      `/api/blabla?limit=20&offset=${(currentPage - 1) * 20}`
    );
    return response.data;
  } catch (err) {
    // 直接抛出原错误,保留完整错误信息
    throw err;
  }
};

内容的提问来源于stack exchange,提问作者Javier Guzmán

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 22:36:04