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

使用GetX GetConnect调用API时Socket Exception捕获失效,请求协助

GetConnect中SocketException捕获失效的排查与修复

问题核心

GetConnect的post方法不会直接抛出SocketException,它会将所有底层网络异常包装为GetConnectException,所以你单独写on SocketException的捕获逻辑永远不会触发。

修复方案

  1. 先捕获GetConnectException,再通过其originalException属性判断是否为SocketException
  2. 保留通用catch块处理其他异常

修改后的代码

import 'dart:io'; // 必须导入才能识别SocketException
import 'package:get/get_connect.dart';

Future<Response> postDatabyJson(uri, body) async {
  try {
    print("Api Url  " + uri.toString());
    print("body " + body.toString());
    Response response = await post(uri, body, headers: _mainHeader);
    return response;
  } on GetConnectException catch (e) {
    // 判断原始异常是否是SocketException
    if (e.originalException is SocketException) {
      print('internet isssssus');
      return Response(statusCode: 0, statusText: '无网络连接,请检查网络');
      // 可恢复注释的重试逻辑
      // var retry = await apiDialog();
      // if(retry){
      //   return await postDatabyJson(uri, body);
      // } else {
      //   return Response(statusCode: 0, statusText: 'Try Again...');
      // }
    } else {
      // 处理其他GetConnect异常(如超时、HTTP错误等)
      return Response(statusCode: 1, statusText: e.toString());
    }
  } catch (e) {
    // 处理非GetConnect类的其他异常
    return Response(statusCode: 1, statusText: e.toString());
  }
}

注意事项

  • 测试断网场景时,需真正断开设备网络(关闭WiFi/移动数据),无效URL会返回HTTP 404响应,不属于SocketException范畴
  • 确保_mainHeader已正确初始化,避免因请求头问题引发其他异常
  • 若需处理超时,可在GetConnect配置中设置timeout,超时异常同样会被包装在GetConnectException中

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:45:32