axios 如何全局处理抛出的异常?

虽然已经在响应拦截器里做了一些全局处理,最后是通过 Promise.reject 抛出的异常

现在每个接口请求方法都还是得写 try/catch 或者 .catch() 真的好麻烦

有什么比较好的方案吗?

阅读 7.2k
10 个回答
async function safeRequest(...args) {
  try {
    const response = await axios(...args);
    return [null, response.data];
  } catch (error) {
    return [error, null];
  }
}

// 使用
const [error, data] = await safeRequest('https://api.example.com/data');
if (error) {
  console.error('请求失败:', error);
} else {
  console.log('请求成功:', data);
}

一般来说我会在响应拦截器中写一个 config.custom.catch 的判断,如果在请求接口时没有明确声明为 true 就使用 return new Promise(() => { }) 返回一个 pending 中的 promise 只单纯做一下异常吐司处理。
如果请求的接口在 config 中声明了 custom.catchtrue 时,则 return Promise.reject(err) 返回异常信息,就可以在具体的业务代码中 .catch 做异常处理了。

我会建议你只在具体的地方 try ... catch,而不是只全局处理。因为每个地方发生错误之后,要展示给用户的错误信息、后续处理很可能是不一样的。全局除了会让你稍微少写一些代码外,并不能带来什么好处。

所以该写的地方就好好写,该省事的地方再省事。

看看我这种方案呢?
image.png
image.png
image.png
image.png
image.png

这是个好问题。一般来说,有两种方式比较常用

  1. 自己封装一个 httpRequest() 之类的函数,在函数中调用 axios 并进行默认的错误处理。如果考虑通用性,可以加一些配置参数来跳过或覆盖默认的错误处理
  2. 使用拦截器。不过拦截器通常应该处理更底层的事情,如果默认的错误处理带弹框之类的上层操作,不太建议采用这种方式。
新手上路,请多包涵

一般接口报错,会在拦截器中统一处理,比如提示后台返回的错误。
如果用Promise.reject去抛出错误,那么业务接口必然要去捕获这个错误,否则浏览器会提示未捕获的错误。
不想每个接口都写 try catch,试试将 return Promise.reject(response.data) 改为 return response.data

我觉得没啥啊,Uncaught是因为你的Axios返回的Promise报错了,没有处理的函数而已。
这种应该的 Waring 不会是 Error才对。

要是每个请求都这样(不管返回值对不对),那是得考虑是不是你配置的Interceptor代码里有问题了...

另外看报错提示,你这是Node Server端么?

await request().catch(() => {})

首先,封装一个request.js 文件,创建一个axios 使用返回值拦截器抛出对应的信息

// 创建一个axios
const service = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url
  timeout: 5000 
})
// 设置返回值拦截器 并抛出 Promise
service.interceptors.response.use(
   response => {
      if(res.code !== 200){
         return Promise.reject({message:res.message,err:new Error(res.message || 'Error')})
      } else {
          return res
      }
   }
   error => {
     return Promise.reject(error)
   }
)
新手上路,请多包涵

试试创建一个自定义的 Axios 实例?然后在该实例上设置全局的拦截器和默认配置。在每个接口请求方法中直接使用这个自定义实例,而不需要在每个方法中重新设置拦截器和默认配置。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题