使用GetX GetConnect调用API时Socket Exception捕获失效,请求协助
GetConnect中SocketException捕获失效的排查与修复
问题核心
GetConnect的post方法不会直接抛出SocketException,它会将所有底层网络异常包装为GetConnectException,所以你单独写on SocketException的捕获逻辑永远不会触发。
修复方案
- 先捕获
GetConnectException,再通过其originalException属性判断是否为SocketException - 保留通用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
相关产品推荐
相关产品推荐

