4 votes

Comment attraper une SocketException en utilisant la bibliothèque http ?

Ce problème a déjà été signalé par d'autres (comme aquí ). Bien que j'aie compris la cause de ce problème, je n'ai toujours pas trouvé de solution lorsque j'utilise l'outil de niveau supérieur http bibliothèque. Par exemple :

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,
    },
  ));
}

Je n'arrive pas à trouver un moyen d'attraper un SocketException qui est lancé, par exemple, si l'hôte ne peut pas être atteint (dans mon cas, l'ip de l'hôte était erronée). J'ai essayé d'envelopper le await en try/catch ou en utilisant Future.catchError .

Il s'agit d'une trace de la pile de l'exception :

[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)

9voto

Richard Heap Points 15826

Vous pouvez modifier login à être async afin que vous puissiez attendre la réponse. Cela vous permet d'attraper l'exception (et, par exemple, de renvoyer la réponse à l'exception). null au lieu de la 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;
  }
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X