【问题标题】:How to catch SocketException using the http library?如何使用 http 库捕获 SocketException?
【发布时间】:2018-07-13 13:01:16
【问题描述】:

这个问题已经被其他人指出了(比如here)。虽然我可能已经理解了原因,但是在使用更高级别的 http 库时,我仍然没有找到解决方案。 例如:

import 'package:http/http.dart';

// yes, pwd is String, it's just a test...
Future<Response> login(String user, String pwd) {
  final authHeader = encodeBasicCredentials(user, pwd);
  return get(
    'http://192.168.0.100:8080/login',
    headers: <String, String>{
    HttpHeaders.AUTHORIZATION: authHeader,
    },
  ));
}

我无法找到一种方法来捕获抛出的SocketException,例如,如果无法访问主机(在我的情况下,主机 ip 错误)。 我尝试将await 包装在try/catch 中,或者使用Future.catchError

这是异常的堆栈跟踪:

[ERROR:topaz/lib/tonic/logging/dart_error.cc(16)] Unhandled exception:
E/flutter ( 4036): SocketException: OS Error: Connection refused, errno = 111, address = 192.168.0.100, port = 35588
E/flutter ( 4036): #0      IOClient.send (package:http/src/io_client.dart:30:23)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #1      BaseClient._sendUnstreamed (package:http/src/base_client.dart:171:38)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #2      BaseClient.get (package:http/src/base_client.dart:34:5)
E/flutter ( 4036): #3      get.<anonymous closure> (package:http/http.dart:47:34)
E/flutter ( 4036): #4      _withClient (package:http/http.dart:167:20)
E/flutter ( 4036): <asynchronous suspension>
E/flutter ( 4036): #5      get (package:http/http.dart:47:3)

【问题讨论】:

    标签: dart flutter dart-http


    【解决方案1】:

    您可以将login 更改为async,以便等待回复。这允许您捕获异常(例如,返回 null 而不是 Response)。

    Future<Response> login(String user, String pwd) async {
      final String authHeader = encodeBasicCredentials(user, pwd);
      try {
        return await get(
            'http://192.168.0.100:8080/login',
            headers: {
              HttpHeaders.AUTHORIZATION: authHeader,
            },
          );
      } catch (e) {
        print(e);
        return null;
      }
    }
    

    【讨论】:

    • 非常感谢,我有点惭愧我自己没有想到这个:)
    • @Richard Heap 我对 try{}catch and try{}on socketException{} 感到困惑。如果我在您的异常处理中使用 'On SocketException 而不是 Catch 会怎样?
    • on 是一种用于过滤您要在特定代码块中处理的异常类型的简写。见:dart.dev/guides/language/language-tour#catch
    【解决方案2】:

    您可以检查异常的类型并相应地处理它,例如:

    Future<Response> login(String user, String pwd) async {
      final String authHeader = encodeBasicCredentials(user, pwd);
      try {
        return await get(
            'http://192.168.0.100:8080/login',
            headers: {
              HttpHeaders.AUTHORIZATION: authHeader,
            },
          );
      } catch (e) {
        if(e is SocketException){
           //treat SocketException
           print("Socket exception: ${e.toString()}");
        }
        else if(e is TimeoutException){
           //treat TimeoutException
           print("Timeout exception: ${e.toString()}");
        }
        else print("Unhandled exception: ${e.toString()}");
      }
    }
    

    最好制作一个错误处理程序库,这样您就可以在 catch 块上调用类似 handleException(e); 的函数。

    【讨论】:

      【解决方案3】:

      http 上的 SocketException

       try {
      
          } on SocketException {
      
          }
      

      【讨论】:

        猜你喜欢
        • 2019-12-30
        • 1970-01-01
        • 2021-08-15
        • 1970-01-01
        • 2017-03-17
        • 2021-04-15
        • 2010-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多