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

Flutter如何捕获API加载失败及无网络时的未处理异常?

解决Flutter中Failed host lookup异常无法捕获的问题

你的问题核心是网络请求代码未被包含在try代码块内,http.get(uri).timeout()执行时抛出的主机查找失败异常,根本没进入后续的try-catch逻辑,所以无法被捕获。

修正后的代码如下:

Future<void> getItems(int id) async {
  final uri = Uri.parse('$kApiUrl${kApiUrlItems}P_ID=$id');
  try {
    http.Response response = await http.get(uri).timeout(kTimeoutDuration); //5 sec
    if (response.statusCode == 200) {
      // 请求成功逻辑
    } else {
      await Fluttertoast.showToast(msg: '请求失败,状态码:${response.statusCode}');
    }
  } on SocketException catch (e) {
    // 捕获网络连接类异常,包括主机查找失败
    await Fluttertoast.showToast(msg: '网络连接异常:${e.message}');
  } on TimeoutException catch (e) {
    await Fluttertoast.showToast(msg: '请求超时,请稍后重试');
  } catch (e) {
    // 兜底捕获其他未预料的异常
    await Fluttertoast.showToast(msg: '请求出错:$e');
  }
}

关键说明:

  • 将await http.get(uri).timeout()移到try块内部,确保网络请求全阶段抛出的异常都能进入捕获逻辑。
  • 主机查找失败属于SocketException的典型场景,会被对应的catch分支处理,你还可以通过e.message判断具体异常信息,做更针对性的提示。
  • 通用catch分支可以兜底处理所有未明确捕获的异常,避免出现未处理异常报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 05:02:45