Gestion des erreurs en Swift : try/catch et techniques avancées

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Gestion des erreurs en Swift : try/catch et bien plus (niveau avancé)

\n\n

La gestion des erreurs est l’un des sujets clés du développement en Swift. Si vous êtes déjà familier avec les bases do-catch et try?, il est temps de passer au niveau supérieur. Dans cet article, nous aborderons des techniques avancées : le travail avec le protocole Error, le type Result, le mot-clé rethrows, ainsi que la manière de concevoir correctement une hiérarchie d’erreurs dans des projets iOS/macOS réels.

\n\n

Plongée approfondie dans le protocole Error et les erreurs personnalisées

\n\n

En Swift, toute erreur doit être conforme au protocole Error. Cependant, pour rendre le code plus lisible et maintenable, il est recommandé de créer vos propres énumérations (enum) avec des cas imbriqués et des valeurs associées.

\n\n
enum NetworkError: Error {\n    case invalidURL\n    case noData\n    case decodingFailed(description: String)\n    case serverError(statusCode: Int)\n    case timeout(seconds: Double)\n}\n\n// Exemple d’utilisation\nfunc fetchUser(id: Int) throws -> User {\n    guard id > 0 else {\n        throw NetworkError.invalidURL\n    }\n    // ... logique de requête\n    if someCondition {\n        throw NetworkError.serverError(statusCode: 500)\n    }\n    return User()\n}
\n\n

Cette approche permet de transmettre un contexte supplémentaire : le code d’erreur, la description ou le délai d’attente. Cela est particulièrement utile pour la journalisation et le débogage.

\n\n

Result : une alternative à do-catch pour le code asynchrone

\n\n

Le type Result<Success, Failure> est un outil puissant issu de la programmation fonctionnelle. Il est idéal pour les API basées sur les callbacks, les requêtes réseau et les opérations asynchrones.

\n\n
enum DataError: Error {\n    case corrupted\n    case notFound\n}\n\nfunc loadImage(from url: URL, completion: @escaping (Result<UIImage, DataError>) -> Void) {\n    DispatchQueue.global().async {\n        // Simulation de chargement\n        if arc4random_uniform(2) == 0 {\n            completion(.success(UIImage()))\n        } else {\n            completion(.failure(.notFound))\n        }\n    }\n}\n\n// Utilisation\nloadImage(from: someURL) { result in\n    switch result {\n    case .success(let image):\n        print("Image chargée : \\(image)")\n    case .failure(let error):\n        print("Erreur : \\(error.localizedDescription)")\n    }\n}
\n\n

Result rend le code plus prévisible et élimine la nécessité de gérer les valeurs optionnelles avec nil. De plus, vous pouvez utiliser .map et .flatMap pour des chaînes de transformations.

\n\n

Rethrows : quand une fonction « transmet » les erreurs

\n\n

Le mot-clé rethrows est l’une des fonctionnalités les plus sous-estimées de Swift. Il permet d’écrire une fonction qui ne lance pas elle-même d’erreurs, mais les « transmet » si la closure passée est throws.

\n\n
func performOperation<T>(on array: [T], operation: (T) throws -> Bool) rethrows -> [T] {\n    var result: [T] = []\n    for element in array {\n        if try operation(element) {\n            result.append(element)\n        }\n    }\n    return result\n}\n\n// Sans erreur (pas besoin de try)\nlet numbers = [1, 2, 3, 4, 5]\nlet evenNumbers = performOperation(on: numbers) { $0.isMultiple(of: 2) }\nprint(evenNumbers) // [2, 4]\n\n// Avec erreur (try nécessaire)\nenum ValidationError: Error { case negative }\nlet filtered = try performOperation(on: numbers) { value in\n    guard value > 0 else { throw ValidationError.negative }\n    return value % 2 == 0\n}
\n\n

rethrows rend l’API flexible : l’utilisateur peut passer une closure normale (sans try) ou une closure avec throws (auquel cas try sera nécessaire). Cela est souvent utilisé dans la bibliothèque standard de Swift — par exemple, dans map, filter et for

Blogs

Book Recommendations