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

如何根据API返回数据抛错,且不触发当前try-catch的catch块?

解决方案

问题出在你的catch块会捕获所有错误——包括你主动抛出的业务逻辑错误和axios的网络连接错误,导致业务错误被覆盖成了连接错误。要区分两种错误类型,分别处理即可。

方法一:利用axios的错误标识判断

axios抛出的错误会自带isAxiosError属性,可直接用来区分网络请求类错误和自定义业务错误:

import axios from 'axios'

export default async () => {
  try {
    const { data } = await axios('https://api.endpoint.com')
    
    if (data.credits < 10) {
      // 抛出业务逻辑错误
      throw new Error('No enough credits')
    } else {
      return 'All good'
    }

  } catch (error) {
    // 仅在axios网络请求失败时,抛出连接提示
    if (axios.isAxiosError(error)) {
      throw new Error('Error connecting...')
    } else {
      // 自定义业务错误原样抛出
      throw error
    }
  }
}

方法二:自定义错误类型(更规范)

创建专属业务错误类,通过类型判断区分错误,可读性和扩展性更强:

import axios from 'axios'

// 定义业务错误类
class BusinessError extends Error {
  constructor(message) {
    super(message)
    this.name = 'BusinessError'
  }
}

export default async () => {
  try {
    const { data } = await axios('https://api.endpoint.com')
    
    if (data.credits < 10) {
      // 抛出自定义业务错误
      throw new BusinessError('No enough credits')
    } else {
      return 'All good'
    }

  } catch (error) {
    // 判断是否为业务错误
    if (error.name === 'BusinessError') {
      throw error
    } else {
      // 处理网络连接类错误
      throw new Error('Error connecting...')
    }
  }
}

原理说明

通过错误类型区分,让catch块只处理axios网络请求失败的场景,你的业务逻辑错误会被跳过处理、直接向上抛出,这样就能实现「连接失败时抛出连接错误,业务数据不满足时抛出对应业务错误」的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 16:25:14