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

Axios响应拦截器抛出的自定义异常对象无法正常获取

解决Axios响应拦截器中获取自定义异常对象的问题

问题根源

你遇到的[object Object]是因为Error构造函数仅接受字符串作为消息参数,当传入对象时,会自动调用Object.toString()将其转为字符串,导致原始对象丢失。

解决方案

方法1:自定义Error类(推荐)

创建继承自原生Error的自定义错误类,将自定义数据直接挂载到实例上,同时保证instanceof判断正常:

import axios from 'axios';

const axiosApi = axios.create({
  baseURL: 'https://jsonplaceholder.typicode.com',
});

// 自定义错误类
class CustomError extends Error {
  constructor(customData) {
    super(JSON.stringify(customData)); // 可选:将对象转为字符串作为错误消息
    this.name = 'CustomError';
    this.customData = customData; // 挂载自定义数据
    // 修复原型链,确保instanceof判断生效
    Object.setPrototypeOf(this, CustomError.prototype);
  }
}

const responseInterceptor = (error) => {
  throw new CustomError({
    name: 'John',
    age: 40,
  });
};

axiosApi.interceptors.response.use((response) => response, responseInterceptor);

const get = async (url) => {
  return await axiosApi
    .get(url, { crossDomain: true })
    .then((response) => response?.data);
};

export default function Home() {
  get('/user/1').then(
    (data) => {},
    (error) => {
      if (error instanceof CustomError) {
        console.log(error.customData); // 输出原始自定义对象 {name: 'John', age: 40}
      }
    }
  );
  return <div>hi</div>;
}

方法2:给原生Error实例添加自定义属性

直接创建原生Error实例,把自定义数据作为额外属性挂载:

const responseInterceptor = (error) => {
  const customError = new Error('自定义业务错误');
  customError.details = {
    name: 'John',
    age: 40,
  };
  throw customError;
};

// 捕获错误时
get('/user/1').then(
  (data) => {},
  (error) => {
    console.log(error.details); // 输出原始自定义对象
  }
);

注意事项

  • 自定义Error类时必须修复原型链,否则instanceof判断可能失效。
  • 如果需要处理Axios自身的请求错误(如网络错误、状态码异常),可在拦截器中先判断错误类型,再添加自定义数据抛出。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:44