New Promise未捕获错误,能否混用reject与catch?Axios错误返回undefined
问题分析与解决方案
核心问题
你的代码存在两个关键问题导致错误无法被正确捕获:
- 冗余的Promise包装:async函数本身会返回Promise,无需再用
new Promise包裹,这种冗余写法可能干扰错误的正常传递。 - 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
相关产品推荐
相关产品推荐

