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

使用try catch无法捕获axios请求返回的404错误该如何处理

代码修复方案

现有代码的核心错误

  • 同步try/catch无法捕获异步Promise抛出的异常:axios.get返回Promise属于异步逻辑,外层同步try块监听不到Promise内部的reject状态,因此404错误会触发Uncaught (in promise)提示。
  • 作用域错误:response变量仅存在于then的回调函数作用域内,外部catch块无法访问该变量,会触发未定义报错。
  • 冗余的await操作:response.data是axios返回的同步属性,不需要用await等待。
  • 非2xx状态码不会进入then回调:axios默认配置下,HTTP状态码不在2xx范围会直接触发Promise reject,你写在then里的状态码判断逻辑在404场景下根本不会执行。

修复代码示例

方案1:async/await搭配try/catch(推荐,逻辑更清晰)

async function fetchWeather(city, api_key) {
  try {
    const response = await axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${api_key}`)
    const data = response.data
    console.log(data)
    document.getElementById('hum').textContent = data.main.humidity;
    document.getElementById('feels-like').textContent = data.main.feels_like;
  } catch (error) {
    // 所有异常都会进入该分支
    if (error.response?.status === 404) {
      // 此处可添加用户提示逻辑,比如弹窗提示城市不存在
      console.log('输入的城市不存在,请检查拼写')
    } else {
      console.log(`请求出错:${error.message}`)
    }
  }
}

方案2:Promise链式调用写法

axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${api_key}`)
  .then(response => {
    const data = response.data
    console.log(data)
    document.getElementById('hum').textContent = data.main.humidity;
    document.getElementById('feels-like').textContent = data.main.feels_like;
  })
  .catch(error => {
    if (error.response?.status === 404) {
      console.log('输入的城市不存在,请检查拼写')
    } else {
      console.log(`请求出错:${error.message}`)
    }
  })

补充说明

如果需要自定义状态码校验规则,让非2xx的状态码也进入then回调,可以配置axios的validateStatus参数:

axios.get(`https://api.openweathermap.org/data/2.5/weather?q=${city}&appid=${api_key}`, {
  // 状态码小于500都判定为请求成功,进入then回调
  validateStatus: status => status < 500
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:54:05