La gestion des erreurs est une compétence fondamentale pour les développeurs mobiles. Selon HackerOne (2025), 62 % des fuites de données sont dues à des exceptions non traitées. Une gestion appropriée des erreurs non seulement prévient les crashs, mais protège également les données utilisateur. Examinons les approches pour iOS, Android et React Native.
Points clés
La gestion des erreurs dans Swift repose sur quatre mécanismes clés : do-catch, throws, guard let et if-let. Contrairement à de nombreux langages, Swift n'autorise pas les exceptions non capturées — chaque erreur doit être explicitement traitée ou déclarée via throws. La gestion des erreurs est une compétence critique pour le développement mobile, impactant directement la stabilité de l'application.
do-catch est le bloc standard pour appeler des fonctions marquées avec throws. Dans do, une fonction est appelée avec try, et si elle lance une erreur, le contrôle passe à catch. Différents types d'erreurs peuvent être traités via le pattern matching. Si une erreur n'est pas traitée, elle se propage vers le haut de la pile (Error Propagation). Pour une gestion efficace des erreurs dans iOS, utilisez do-catch comme mécanisme principal.
Throw est déclaré dans la signature de la fonction : func fetchData() throws -> Data. Cela signifie que le code appelant doit traiter l'erreur via try, try? ou try!. try? convertit l'erreur en nil, try! provoque un crash en cas d'erreur (à utiliser uniquement si vous êtes certain du succès). La gestion des erreurs via throw est une pratique obligatoire dans Swift.
Guard let est une construction pour la sortie anticipée d'une fonction si la valeur est nil. Contrairement à if-let, guard let nécessite une sortie (return, throw, break) dans la branche else. Cela rend le code plus plat et plus lisible — sans blocs if imbriqués. Si un optional ne peut pas être nil — utilisez force unwrap (!), uniquement lorsque vous êtes absolument certain. Dans une application mobile, guard let aide à éviter les crashs lors du traitement des valeurs optionnelles.
Optional Chaining (user?.address?.city) et nil-coalescing (??) sont du sucre syntaxique pour travailler avec les optionals sans déballage. Chez IT Sectr, nous utilisons guard let pour valider les paramètres d'entrée de l'API et imposons à l'équipe d'éviter le force unwrap sans commentaire explicite. Un gestionnaire d'erreurs à chaque niveau protège contre les défaillances inattendues.
Kotlin est le langage principal pour le développement Android. Il hérite de try-catch de Java mais ajoute des alternatives plus sûres : l'opérateur elvis, require, check et sealed class. La gestion des erreurs dans Kotlin repose sur une combinaison de ces mécanismes. Contrairement à Swift, Kotlin n'exige pas le traitement des exceptions vérifiées (toutes les exceptions sont unchecked). Pour la gestion des erreurs dans les applications mobiles sur Android, utilisez sealed class comme modèle principal.
Try-catch dans Kotlin fonctionne comme une expression — il retourne une valeur. val result = try { fetchData() } catch (e: Exception) { fallbackValue }. Cela réduit le code. L'opérateur Elvis (?:) est un analogue du nil-coalescing pour les types nullable : val name = user?.name ?: "Guest". Pour la gestion des erreurs dans les applications mobiles, try-catch en tant qu'expression est l'approche la plus concise.
Sealed class est un outil puissant pour modéliser les états de succès et d'erreur. sealed class NetworkResult { data class Success(val data: T) : NetworkResult(); data class Error(val message: String) : NetworkResult() }. Lorsqu'elle est utilisée dans une expression when, le compilateur vérifie l'exhaustivité des branches. La gestion des erreurs via sealed class garantit qu'aucun état ne reste non traité.
// Sealed class + try-catch — modèle typique pour Android
sealed class NetworkResult<out T> {
data class Success<out T>(val data: T) : NetworkResult<T>()
data class Error(val message: String) : NetworkResult<Nothing>()
}
fun fetchUser(id: String): NetworkResult<User> {
return try {
NetworkResult.Success(api.getUser(id))
} catch (e: Exception) {
NetworkResult.Error("Failed: ${e.message}")
}
}
Dans l'exemple, la sealed class NetworkResult modélise deux états : succès avec données et erreur avec message. La fonction fetchUser retourne un résultat dans tous les cas, et le code appelant traite les deux branches via when. Cela élimine la possibilité d'une erreur non traitée. La gestion des erreurs via sealed class est la norme pour le développement Android chez IT Sectr.
Result est un type intégré de Kotlin pour représenter le résultat d'une opération qui peut échouer. Il force le traitement du succès et de l'échec via fold, getOrThrow ou map. Result est utile dans les chaînes asynchrones (coroutines). La gestion des erreurs avec Result est une norme pour le développement mobile en Kotlin.
Either est un type fonctionnel de la bibliothèque Arrow qui permet de retourner une valeur de l'un des deux types (Left — erreur, Right — succès). Contrairement à Result, Either peut contenir n'importe quel type d'erreur défini par l'utilisateur. Pour les projets simples, le Result intégré est suffisant ; pour les projets complexes, utilisez Either d'Arrow. Le choix de l'outil de gestion des erreurs dépend de la complexité du projet.
La propagation des erreurs est un mécanisme par lequel une erreur se propage vers le haut de la pile d'appels jusqu'à ce qu'elle soit traitée. Dans Kotlin, cela se produit par défaut (exceptions unchecked). Dans Swift, cela s'applique uniquement aux fonctions marquées avec throws. Avec Result et Either, les erreurs ne se propagent pas — elles restent dans le type et vous devez les traiter. Cela rend la gestion des erreurs dans les applications mobiles plus sûre.
| Paramètre | iOS (Swift) | Android (Kotlin) |
|---|---|---|
| Mécanisme de base | do-catch + throws | try-catch (expression) |
| Optional/Nullable | guard let, if-let, ?? | ?. let, elvis (?:) |
| Approche fonctionnelle | Result (Swift 5+) | Result, Either (Arrow) |
| Modélisation des erreurs | Enum : Error | Sealed class |
| Exceptions vérifiées | Oui (throws) | Non (toutes unchecked) |
| Non-fatal | os_log, Crashlytics | Timber, Crashlytics |
Le tableau montre les principales différences. iOS nécessite une déclaration explicite des erreurs (throws), rendant le code plus sûr mais plus verbeux. Android repose sur la discipline du développeur. Chez IT Sectr, nous utilisons sealed class pour Android et throws pour iOS — c'est la bonne pratique des deux plateformes pour la gestion des erreurs dans les applications mobiles.
Le crash reporting est un système de collecte et d'analyse des crashs d'application. Le crash reporting est une partie essentielle de la gestion des erreurs en production. Sans lui, vous découvrez les problèmes par les utilisateurs, ce qui est inacceptable pour la production. Deux outils principaux : Firebase Crashlytics (gratuit) et Sentry (gratuit pour une utilisation de base). Pour la gestion des erreurs dans les applications mobiles, implémentez toujours le crash reporting dès la première version.
Crashlytics fait partie de Firebase. Il collecte automatiquement les crashs, les regroupe par pile d'appels et affiche le nombre d'utilisateurs affectés. Il prend en charge la journalisation des erreurs non fatales via recordException(). Intégration : ajoutez le SDK à build.gradle (Android) ou Podfile (iOS). Crashlytics est le meilleur outil gratuit pour la gestion des erreurs au démarrage d'un projet.
Sentry est un système multiplateforme de surveillance des erreurs. Contrairement à Crashlytics, Sentry fournit un traçage détaillé (breadcrumbs), une surveillance des performances et un support pour React Native. Il permet de visualiser l'état de l'application au moment de l'erreur. IT Sectr recommande Sentry pour les projets qui nécessitent un contrôle total sur la gestion des erreurs dans le développement mobile.
Error Boundary est un composant React qui capture les erreurs JavaScript dans l'arbre des composants enfants et affiche une interface de secours, empêchant un crash complet de l'application. Error Boundary est un composant clé pour la gestion des erreurs dans React Native. Utilisez les error boundaries pour les écrans critiques et la navigation. La gestion des erreurs dans les applications mobiles sur React Native nécessite une configuration appropriée d'Error Boundary au niveau supérieur.
Error Boundary est créé via componentDidCatch(error, errorInfo) ou static getDerivedStateFromError(error). Il ne capture pas les erreurs dans le code asynchrone (setTimeout, requestAnimationFrame), le rendu côté serveur ou les erreurs natives (Native Modules). Pour la journalisation, utilisez le SDK de crash reporting dans componentDidCatch. Error Boundary est un gestionnaire d'erreurs simple mais efficace pour la couche UI.
Erreur fatale est une exception non traitée qui provoque un crash de l'application. Erreur non fatale est une exception que vous avez capturée et traitée, mais qui indique un problème dans le code. Les erreurs non fatales sont journalisées via Crashlytics/Sentry et aident à trouver les bugs avant qu'ils ne deviennent fatals. Les erreurs fatales et non fatales nécessitent toutes deux une gestion appropriée des erreurs dans le développement mobile.
Foire aux questions
try-catch est un mécanisme de langage pour les exceptions. Result est un type wrapper qui force la gestion des erreurs à la compilation. Chez IT Sectr, nous préférons Result pour la logique métier et try-catch pour travailler avec des systèmes externes. Les deux approches font partie de la gestion générale des erreurs dans Kotlin.
Error Boundary est un composant React qui capture les erreurs JavaScript dans l'arbre des composants enfants et affiche une interface de secours au lieu de faire planter toute l'application. Il ne capture pas les erreurs dans le code asynchrone ou le rendu côté serveur. Error Boundary est un élément important de la gestion des erreurs dans les applications mobiles sur React Native.
Crashlytics (Firebase) est le meilleur choix pour commencer : gratuit, intégration simple, regroupement automatique des crashs. Sentry est pour les projets qui nécessitent un traçage détaillé des erreurs et une surveillance des performances. Le choix de l'outil de gestion des erreurs dépend du budget et des exigences de surveillance.
Erreur fatale est un crash de l'application (exception non capturée). Erreur non fatale est une exception que vous avez capturée et traitée, mais qui indique un problème dans le code. Les erreurs non fatales sont journalisées séparément et aident à trouver les bugs avant qu'ils ne deviennent fatals. La gestion des erreurs dans une application mobile doit inclure la surveillance des deux types.
guard let est utilisé pour la sortie anticipée d'une fonction lorsqu'une valeur est manquante — cela rend le code plus linéaire et lisible. if-let est approprié lorsqu'un optional est nécessaire dans un bloc et qu'aucune sortie de fonction n'est requise. guard let est préférable pour valider les paramètres d'entrée et fait partie de la gestion des erreurs dans iOS.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.