Gestion des erreurs sur Android

Kotlin n'est pas compatible avec les exceptions vérifiées. Cela simplifie et accélère la gestion des erreurs, car vous pouvez choisir de ne gérer que les exceptions potentiellement récupérables. Et comme vous n'avez pas besoin de gérer explicitement toutes les exceptions possibles, votre code est moins encombré et, par conséquent, reste plus axé sur son objectif principal.

Les échecs récupérables sont des problèmes qu'un développeur peut résoudre de son côté. Par exemple, si un ID utilisé dans un appel n'est pas valide, l'API génère une exception HomeException avec un message invalid data. Le développeur de l'application peut ensuite choisir de supprimer cet ID de son cache ou d'afficher un message tel que "Structure introuvable" à l'utilisateur.

Exemple de gestion d'un échec récupérable:

val result =
   try {
     homeManager.requestPermissions()
   } catch (e: HomeException) {
     PermissionsResult(
       PermissionsResultStatus.ERROR,
       "Got HomeException with error: ${e.message}",
     )
   }

Toute méthode des API Home peut générer une exception HomeException. Nous vous recommandons donc d'utiliser un bloc try-catch pour intercepter les exceptions HomeException sur tous les appels.

Lorsque vous gérez HomeException, vérifiez ses champs code et message pour savoir ce qui s'est mal passé.

Toute exception non gérée entraînera le plantage de votre application.

Le tableau suivant indique la signification des codes HomeException que vous pouvez rencontrer:

Tableau: codes HomeException
Code Signification
ABORTED L'opération a été abandonnée, généralement en raison d'un problème de simultanéité, tel qu'un échec de vérification du séquenceur ou un abandon de transaction.
ALREADY_EXISTS L'entité qu'un client a tenté de créer (par exemple, un fichier ou un répertoire) existe déjà.
API_NOT_CONNECTED Le client a tenté d'appeler une méthode à partir d'une API qui n'a pas réussi à se connecter. Cela peut se produire lorsque l'appareil est hors connexion ou qu'il n'est pas compatible avec l'API que le client a tenté d'appeler.
CANCELLED L'opération a été annulée, généralement par l'appelant.
DATA_LOSS Une perte ou une corruption de données irrécupérable s'est produite.
DEADLINE_EXCEEDED Le délai a expiré avant que l'opération puisse se terminer. Pour les opérations qui modifient l'état du système, cette erreur peut être affichée même si l'opération s'est terminée avec succès.
FAILED_PRECONDITION L'opération a été rejetée car le système n'est pas dans un état requis pour exécuter l'opération. Par exemple, ce message peut s'afficher si la commande stop de OvenCavityOperationalStateTrait a été appelée sur un four déjà arrêté ou si vous avez tenté d'exécuter une opération rmdir sur un emplacement qui n'est pas un répertoire.
INTERNAL Erreurs internes. Cela signifie que certains invariants attendus par le système sous-jacent n'ont pas été respectés. Ce code d'erreur est réservé aux erreurs graves.
INVALID_ARGUMENT Le client a fourni un argument qui ne se trouve pas dans la plage de valeurs attendue.
NOT_FOUND Une entité demandée (par exemple, un fichier ou un répertoire) est introuvable. Si une requête est refusée pour toute une classe d'utilisateurs, telle que le déploiement progressif des fonctionnalités ou la liste d'autorisation non documentée, NOT_FOUND peut être utilisé. Si une requête est refusée pour certains utilisateurs appartenant à une classe d'utilisateurs, telle que le contrôle des accès basé sur l'utilisateur, PERMISSION_DENIED doit être utilisé.
OUT_OF_RANGE L'opération a été tentée au-delà de la plage valide (par exemple, rechercher ou lire après end-of-file). Contrairement à INVALID_ARGUMENT, cette erreur indique un problème pouvant être résolu si l'état du système change.
PERMISSION_DENIED L'appelant n'est pas autorisé à exécuter l'opération spécifiée. PERMISSION_DENIED ne doit pas être utilisé pour les refus causés par l'épuisement d'une ressource (utilisez plutôt RESOURCE_EXHAUSTED pour ces erreurs). PERMISSION_DENIED ne doit pas être utilisé si l'appelant ne peut pas être identifié (utilisez UNAUTHENTICATED pour ces erreurs). Ce code d'erreur n'implique pas que la requête soit valide ni que l'entité demandée existe ou qu'elle répond à d'autres prérequis.
RESOURCE_EXHAUSTED Certaines ressources ont été épuisées, par exemple en raison d'un quota par utilisateur atteint ou du manque d'espace dans l'ensemble du système de fichiers. Par exemple, cette erreur peut se produire si la commande dispense de DispenseTrait est appelée sur un appareil distributeur de nourriture pour animaux de compagnie, mais qu'il n'y a plus de nourriture dans l'appareil.
SDK_INITIALIZATION_MISSING_INFO Le SDK a été initialisé sans toutes les informations requises. Par exemple, cette erreur est générée si le client tente d'obtenir un TraitFactory pour un ID de trait donné, mais que le trait n'a pas été inclus lors de l'initialisation du SDK. Consultez Initialiser la maison sur Android.
UNAUTHENTICATED L'appelant ne peut pas être identifié ou la requête ne dispose pas d'identifiants d'authentification valides.
UNAVAILABLE Le service est indisponible. Il s'agit probablement d'une condition temporaire qui peut être corrigée en réessayant après avoir laissé passer un intervalle entre les tentatives. Notez qu'il n'est pas toujours sûr de relancer des opérations non idempotentes.
UNIMPLEMENTED L'opération demandée n'est pas implémentée, prise en charge ou activée dans ce service.
UNKNOWN Erreur inconnue. UNKNOWN s'affiche lorsqu'une condition d'erreur se produit et ne peut être classée à l'aide d'aucun des autres codes d'erreur. Par exemple, cette erreur peut être renvoyée lorsqu'une valeur d'état reçue d'une API externe ne dispose pas d'informations suffisantes sur la cause du problème.