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

New Promise未捕获错误,能否混用reject与catch?Axios错误返回undefined

问题分析与解决方案

核心问题

你的代码存在两个关键问题导致错误无法被正确捕获:

  1. 冗余的Promise包装:async函数本身会返回Promise,无需再用new Promise包裹,这种冗余写法可能干扰错误的正常传递。
  2. axios默认错误触发逻辑:axios仅在发生网络错误(如请求无法发送、DNS失败)时才会抛出错误;对于HTTP错误状态码(如404、500),axios会正常返回响应,不会自动进入catch块。

最优修复方案

1. 简化代码结构,移除冗余Promise

async函数内部的throw会自动触发Promise的reject,return会触发resolve,无需手动调用resolve/reject。

2. 确保HTTP错误能被捕获

有两种方式处理:

  • 方式一:配置axios的validateStatus:指定哪些状态码视为成功,非指定状态码会自动抛出错误。
  • 方式二:手动判断响应状态码:在获取响应后主动校验状态,不符合则抛出错误。

修复后的代码示例

export default {
    async setRecordList({ commit }) {
        try {
            // 明确axios请求配置,避免歧义
            const resp = await axios({
                url: 'getRecord',
                method: 'get',
                // 可选:明确校验状态码,非2xx则抛出错误(axios默认也是此规则,可省略)
                validateStatus: (status) => status >= 200 && status < 300
            });

            // 可选:如果需要自定义状态码校验,可替换上面的validateStatus
            // if (resp.status < 200 || resp.status >= 300) {
            //     throw new Error(`请求失败,状态码:${resp.status}`);
            // }

            const data = resp.data;
            commit('setRecordList', data);
        } catch (err) {
            console.log("捕获到错误:", err);
            // 直接抛出错误,调用方通过.catch()即可捕获
            throw err;
        }
    }
}

额外说明

如果你的项目中多次需要处理HTTP错误,建议全局配置axios的validateStatus,避免重复代码:

// 全局axios配置示例
axios.defaults.validateStatus = (status) => status >= 200 && status < 300;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:50:19