【问题标题】:How to catch http.get (SocketException)如何捕获 http.get (SocketException)
【发布时间】:2019-12-30 05:10:41
【问题描述】:

我是 Flutter & Dart 的新手,正在尝试完成我的第一个应用程序。

我无法捕获(使用 try-catch 块)http.get SocketException(当您调用 API 并关闭 WiFi 时会发生这种情况)

我在互联网上尝试了一切都没有运气,我什至尝试(Dio)包来捕获这个异常,但没有成功。

如何重现:使用底部代码...关闭手机的 WiFi...调用 API...现在应用程序在您的 IDE 中因 (SocketException) 而崩溃。

图片:https://imgur.com/bA0rKEN

这是我的简单代码(更新)

     RaisedButton(
              child: Text("Call API"),
              onPressed: () async {
                try {
                  http.Response response = await getLoginResponse();
                  //do something with response
                  print(response.body);
                } catch (e) {
                  print("Button onPressed Error: " + e.toString());
                }
              },
            )
//---------------------------------------------------------------
Future<http.Response> getLoginResponse() {
    return http.get(loginUrl).timeout(Duration(seconds: 10))
    .then((response) {
      return response;
    }, onError: (e) {
      print("onError: " + e.toString());
    }).catchError((err) {
      print("catchError: " + err.toString());
      return null;
    });
  }

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您可以捕获多种类型的错误并分别处理每一种错误

    例子:

    import 'dart:io' as Io;
    
    http.Client client = http.Client();
    
    try {
      response = await client.get(url).timeout(new Duration(seconds: 10));
    } on Io.SocketException catch (_) {
      throw Exception('Not connected. Failed to load data');
    } on TimeoutException catch (_) {
      throw Exception('Not connected. TimeOut Exception');
    } catch (e) {
      // Default error handling;
    }
    

    【讨论】:

      【解决方案2】:

      如果你想在 RaisedButton 的 try-catch 块中捕获,而不是在 getLoginInfo() 方法中返回 null,你必须返回一个像这样的异常:

       Future<List<LoginObject>> getLoginInfo() async {
          try {
            List<LoginObject> loginObjectList = List<LoginObject>();
            http.Response loginResponse =
                await http.get(loginUrl).timeout(Duration(seconds: 10));
            if (loginResponse.statusCode == 200) {
              loginObjectList = loginObjectFromJson(loginResponse.body);
              return loginObjectList;
            } else {
              throw Exception('Authentication Error');
            }
          } catch (e) {
            print("Error: " + e.toString());
            return throw Exception('Connection Error');;
          }
        }
      

      注意:如果你想处理每一个错误响应,你可以创建一个自定义的ErrorModelClass并用它处理错误状态,最后返回你的ErrorModelClass。

       catch (error) {
            print(error);
            throw error is HttpResponseError ? error : HttpResponseError(0,"error connection");
      

      HttpResponseError 是我的自定义模型类。

      【讨论】:

      • 我只想处理这个异常,因为上面的代码中没有(try-catch 块)可以处理这个异常。当此异常发生时,应用程序崩溃,尽管 http.get 被 try-catch 块包围。
      • @Vamp808 好的,知道了。我测试你的代码。 http.get() 没有任何异常。检查两件事。首先检查 LoginObject 与您的 API 响应,然后检查此行: loginObjectList = loginObjectFromJson(loginResponse.body);
      • 感谢您的回复,http.get 是例外,为了更清楚请看我的更新。
      • @Vamp808 我使用了 Android Studio (IntelliJ IDEA),try-catch 块捕获了异常。我没有遇到这个问题。
      • 非常感谢,我尝试使用 Android Studio 调试应用程序,但没有发生此问题,try-catch 块捕获了 SocketException,应用程序没有崩溃。看起来这与 VS Code 和/或 Flutter/Dart 插件的工作方式有关(可能是一个错误)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-04
      • 1970-01-01
      • 1970-01-01
      • 2018-04-28
      • 2017-03-17
      • 2021-04-15
      • 1970-01-01
      相关资源
      最近更新 更多