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

Flutter中try/catch无法捕获异常问题求助

问题原因及解决办法

你的try/catch没触发,大概率是因为你使用的http包的get方法不会在HTTP状态码错误时抛出异常,只有网络层面的错误(比如DNS解析失败、连接超时、无网络)才会主动抛出异常。像API密钥错误返回401、城市不存在返回404这类HTTP错误,get只会返回一个带错误状态码的Response对象,代码会继续往下执行,不会进入catch。

另外,如果API返回了合法的错误JSON(比如{"error": "Invalid city"}),jsonDecode不会报错,而访问data['hour']这类不存在的key只会返回null,字符串拼接时也不会抛出异常,自然也触发不了catch。

解决办法如下:

  • 手动检查HTTP状态码:拿到响应后先判断状态码是否在2xx范围内,否则主动抛出异常,让catch捕获:

    if (response.statusCode < 200 || response.statusCode >= 300) {
      throw Exception('请求失败:${response.statusCode},详情:${response.body}');
    }
    
  • 校验返回数据的字段:解析JSON后,检查所需的hour、minute、second字段是否存在,避免因null导致无异常但数据错误的情况:

    if (data['hour'] == null || data['minute'] == null || data['second'] == null) {
      throw Exception('返回数据格式错误,缺少时间字段');
    }
    

修改后的完整代码:

Future<void> getTime() async {
    try {
        Response response = await get(Uri.parse('https://api.api-ninjas.com/v1/worldtime?city=$location'),
                                      headers: {'Api_Key': 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'},
        );  

        // 检查HTTP状态码
        if (response.statusCode < 200 || response.statusCode >= 300) {
          throw Exception('请求失败:${response.statusCode},详情:${response.body}');
        }

        Map data = jsonDecode(response.body);
        // 校验数据字段
        if (data['hour'] == null || data['minute'] == null || data['second'] == null) {
          throw Exception('返回数据格式错误,缺少时间字段');
        }

        time = "${data['hour']}h - ${data['minute']}m - ${data['second']}s";
    }   
    catch (e) {
        print('caught error: $e');
        time = 'could not get time data';
    }   
}

另外要确认你调用getTime时是用await getTime(),如果直接调用getTime()而不加await,函数内部的异常可能会变成未处理的Future错误,但你的catch在函数内部,只要是await调用就可以正常捕获。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 22:40:24