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
相关产品推荐
相关产品推荐

