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é :
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 :
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
:
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.