Gestion des erreurs sur Android

Kotlin n'est pas compatible avec les exceptions vérifiées. Cela simplifie et rationalise la gestion des exceptions, car vous pouvez choisir de ne gérer que les exceptions potentiellement récupérables. De plus, comme vous n'avez pas besoin de gérer explicitement toutes les exceptions possibles, votre code est moins encombré et reste donc plus concentré 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 erreur HomeException avec un message invalid data. Le développeur d'applications peut alors choisir de supprimer cet ID de son cache ou d'afficher un message du type "Structure introuvable" à l'utilisateur.

Voici un 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}",
     )
   }

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

Lorsque vous gérez HomeException, vérifiez ses champs error.code et error.message pour savoir ce qui s'est mal passé. Il peut également y avoir des codes de sous-erreur. Appelez donc la méthode getSubErrorCodes() et vérifiez le résultat.

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

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

Table : codes HomeException
Code Signification
ABORTED L'opération a été annulé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 pu se connecter. Cela peut se produire lorsque l'appareil est hors connexion ou 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.
COMMAND_FAILED Échec de l'exécution de la commande. Pour en savoir plus, consultez les sous-codes d'erreur.
CURSOR_WINDOW_NOT_SUPPORTED Une méthode utilisant un CursorWindow a été appelée, mais un CursorWindow n'est pas activé ou n'est pas pris en charge dans le contexte actuel.
DATA_LOSS Une perte ou 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 renvoyée même si l'opération s'est terminée correctement.
DECOMMISSIONING_INELIGIBLE Échec de la mise hors service, car l'appareil n'est pas éligible à la mise hors service.
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, vous pouvez recevoir ce message si la commande stop de OvenCavityOperationalStateTrait a été appelée sur un four qui est déjà arrêté.
INTERNAL Erreurs internes. Cela signifie que certains invariants attendus par le système sous-jacent ont été rompus. Ce code d'erreur est réservé aux erreurs graves.
INVALID_ARGUMENT Le client a fourni un argument qui se trouve en dehors de la plage de valeurs attendue.
INVALID_DATA_HOLDER Le détenteur des données n'est pas valide.
NOT_FOUND Une entité demandée (par exemple, un fichier ou un répertoire) est introuvable. NOT_FOUND peut être utilisé si une requête est refusée pour toute une classe d'utilisateurs, telle que le déploiement progressif d'une fonctionnalité ou une liste d'autorisation non documentée. 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 en recherchant ou en lisant au-delà de 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'a pas l'autorisation d'exécuter l'opération spécifiée. PERMISSION_DENIED ne doit pas être utilisé pour les rejets 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 plutôt 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éponde à d'autres prérequis.
RESOURCE_EXHAUSTED Une ressource a été épuisée, peut-être parce qu'un quota par utilisateur a été atteint ou que l'ensemble du système de fichiers manque d'espace. Par exemple, cette erreur peut être générée si la commande dispense de DispenseTrait est appelée sur un distributeur de nourriture pour animaux, mais qu'il n'y a plus de nourriture dans l'appareil.

Cela peut également être dû au dépassement d'un quota de projet des API Home. Pour en savoir plus, consultez Gestion des quotas.
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 caractéristique donné, mais que la caractéristique n'a pas été incluse 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 que relancer des opérations non idempotentes peut présenter des risques.
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 qu'elle ne peut pas être classée à l'aide d'un autre code d'erreur. Par exemple, cette erreur peut s'afficher lorsqu'une valeur d'état reçue d'une API externe ne fournit pas suffisamment d'informations sur la cause racine.
WRITE_FAILED Échec de l'exécution de l'écriture. Pour en savoir plus, consultez les sous-codes d'erreur.