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

