You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

天气应用输入无效城市时错误捕获异常,请求技术排查

排查天气应用错误捕获失效的问题

听起来你遇到的问题很典型——API请求相关的错误没被正确捕获,导致后续处理炸了还没给用户任何反馈。我来帮你拆解下可能的原因和解决办法:

可能的问题1:fetch 默认不捕获HTTP错误状态码

fetch 只有在网络层面彻底失败(比如断网、域名解析失败)时才会触发reject,像404(城市不存在时API返回的状态)这种HTTP错误,它会正常resolve,但返回的response是不ok的。如果你只在fetch后面加.catch(),这种情况根本进不去catch块,后续处理数据时因为拿到的是空数据或者错误格式,就会报“无法获取属性”的错误。

解决办法:在fetch的第一个then里先判断response状态,手动抛出错误让catch捕获:

fetch(`https://你的天气API地址?city=${输入的城市名}`)
  .then(response => {
    if (!response.ok) {
      // 手动抛出错误,让后续catch能捕获到
      throw new Error(`请求失败:${response.status}`);
    }
    return response.json();
  })
  .then(data => {
    // 处理正常的天气数据,更新UI
    updateWeatherUI(data);
  })
  .catch(error => {
    // 现在网络错误和HTTP错误都会进入这里
    console.error('获取天气失败:', error);
    // 别忘了给用户UI反馈!比如显示“未找到该城市”
    showErrorTip('抱歉,未找到该城市的天气信息,请检查城市名称');
  });

可能的问题2:错误发生在catch覆盖范围之外的同步代码里

你说在第97行加了catch,但如果后续处理数据的代码(比如data.weather.temp这种访问深层属性的操作)没有被包裹在try/catch里,或者不在promise的链式调用范围内,那同步代码抛出的错误就不会被这个catch捕获。

比如这种错误写法就会出问题:

// 错误示例:同步代码的错误没被捕获
fetch(...)
  .then(response => response.json())
  .then(data => {
    // 这里如果data是undefined或者没有weather属性,会直接报错,不会进下面的catch
    const temp = data.weather.temp; 
    updateUI(temp);
  })
  .catch(error => {
    console.log(error); // 捕获不到上面同步代码的错误
  });

解决办法:把同步处理代码也包裹在try/catch里,或者用async/await统一捕获所有错误:

// 用async/await更简洁,能统一捕获异步+同步错误
async function getWeather(cityName) {
  try {
    const response = await fetch(`https://你的天气API地址?city=${cityName}`);
    if (!response.ok) throw new Error(`HTTP错误:${response.status}`);
    const data = await response.json();
    // 这里处理数据,哪怕同步出错也会被下面的catch捕获
    const temp = data.weather.temp;
    updateWeatherUI(temp);
  } catch (error) {
    console.error('错误详情:', error);
    showErrorTip('抱歉,无法获取该城市天气,请检查城市名称');
  }
}

最后关键的一步:给UI加错误反馈

你之前说UI无任何响应,就算捕获到错误,也要在页面上给用户明确提示——比如显示一个红色的错误文本、弹窗,不然用户根本不知道自己输入的城市有问题,只会觉得App卡住了。

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

火山引擎 最新活动