17. Gérer les erreurs

Mercredi 17/1/24
538 Mots
3 Minutes

4. Gérer les erreurs

Lors de l'appel à une API, diverses erreurs peuvent survenir. Il est donc important de mettre en place des mécanismes de gestion des erreurs pour garantir une bonne expérience utilisateur. En Dart, cela se fait principalement à l'aide des blocs try-catch-finally.

Gestion des erreurs courantes

1. Pas de connexion Internet

Pour gérer le cas où l'appareil n'a pas de connexion Internet, il est judicieux de vérifier l'état de la connectivité avant de faire l'appel API. La bibliothèque recommandée pour cela est connectivity_plus. En cas d'absence de connexion, vous pouvez afficher un message d'erreur approprié à l'utilisateur.

Voici un exemple de vérification de la connectivité :

dart
import 'package:connectivity_plus/connectivity_plus.dart';

Future<void> checkConnectivity() async {
  var connectivityResult = await (Connectivity().checkConnectivity());
  if (connectivityResult == ConnectivityResult.none) {
    throw Exception('Pas de connexion Internet');
  }
}

2. Erreurs côté serveur

Lorsqu'une erreur survient côté serveur, la réponse HTTP renvoyée est généralement un code d'erreur (par exemple, 404, 500, etc.). Pour gérer ces erreurs, vous devez vérifier le code de statut dans la réponse HTTP.

  • 400-499 : Il s'agit d'erreurs côté client, par exemple une demande mal formée (404 : Ressource non trouvée, 403 : Accès refusé).
  • 500-599 : Ce sont des erreurs côté serveur, indiquant que le serveur a échoué à traiter la requête correctement (par exemple, 500 : Erreur interne du serveur).

Il est important d'afficher un message d'erreur approprié à l'utilisateur pour ces différents cas.

3. Erreur d'analyse JSON

Lorsqu'une API renvoie une réponse, celle-ci est généralement au format JSON. En Dart, vous pouvez utiliser la bibliothèque dart:convert pour analyser les données. Toutefois, une erreur d'analyse peut se produire si les données JSON sont mal formées. Pour gérer cette situation, vous pouvez utiliser un bloc try-catch pour capturer l'exception FormatException.

Exemple complet de gestion des erreurs

Voici un exemple montrant comment gérer les différents types d'erreurs évoqués plus haut :

dart
import 'dart:convert';
import 'dart:io';
import 'package:http/http.dart' as http;
import 'package:connectivity_plus/connectivity_plus.dart';

Future<void> fetchData() async {
  try {
    // Vérification de la connectivité
    var connectivityResult = await (Connectivity().checkConnectivity());
    if (connectivityResult == ConnectivityResult.none) {
      throw Exception('Pas de connexion Internet');
    }

    // Appel à l'API
    final response = await http.get(Uri.parse('https://example.com/data.json'));
    
    // Vérification des erreurs côté serveur
    if (response.statusCode == 200) {
      final jsonData = json.decode(response.body);
      // Utiliser les données JSON ici
    } else if (response.statusCode >= 400 && response.statusCode < 500) {
      throw Exception('La demande n\'est pas valide (${response.statusCode})');
    } else if (response.statusCode >= 500 && response.statusCode < 600) {
      throw Exception('Le serveur a rencontré une erreur (${response.statusCode})');
    }
  } on SocketException {
    // Gérer l'absence de connexion Internet
    throw Exception('Pas de connexion Internet');
  } on FormatException {
    // Gérer les erreurs d'analyse JSON
    throw Exception('Erreur d\'analyse des données');
  } catch (error) {
    // Gérer les autres erreurs
    throw Exception('Erreur inattendue : $error');
  }
}

Affichage des erreurs à l'utilisateur

En production, il est recommandé de ne pas seulement lancer des exceptions, mais aussi de capturer et afficher ces erreurs de manière conviviale à l'utilisateur. Par exemple, vous pouvez utiliser un SnackBar ou une boîte de dialogue pour informer l'utilisateur de l'erreur.

Exemple avec un SnackBar :

dart
ScaffoldMessenger.of(context).showSnackBar(
  SnackBar(
    content: Text('Erreur : ${error.message}'),
  ),
);

Optimisation

Vérifier l'état de la connectivité avant chaque requête API peut ajouter un léger surcoût en termes de performance. Une bonne pratique serait de vérifier la connexion périodiquement ou d'utiliser un observateur d'état de connectivité pour réagir aux changements de réseau.