Pendant ce cours, nous avons croisé différentes petites choses qui ne vous sont pas forcément familières. On a notamment parlé du protocole Error
avec notre classe QuoteError
, et on a croisé le mot-clé try
. On n'est pas rentrés dans le détail, car je ne voulais pas vous perturber avec trop d'informations à la fois.
Mais maintenant que les choses sont derrière nous, nous allons voir tout ça sérieusement !
Appréhendez la gestion d’erreur en Swift
Tout cela est du domaine de la gestion d'erreur en Swift. Concernant ce sujet, nous avons déjà parlé du mot-clé guard
. Et nous allons maintenant nous attaquer à la suite avec :
le protocole
Error
et le mot-cléthrow
que nous allons voir dans ce chapitre ;les mot-clés
try
,do
,catch
dont nous allons parler dans le prochain chapitre.
Pour découvrir tout ça, je vous propose de reprendre le Playground. Oui je sais, ça vous manquait !
Je vous invite à télécharger ici un Playground que j'ai préparé pour vous.
Dans ce Playground, vous trouverez l'implémentation très simple d'un système de commande. Imaginez un panier sur un site web. Il y a donc une classe Order
qui gère la commande.
Cette classe admet deux propriétés :
items
qui est un tableau d'items. Les items étant les objets de la commande ;status
: il y a deux statuts possibles :pending
, si la commande est en cours, etpayed
si la commande est payée.
Ensuite, il y a une méthode pay
qui permet de payer la commande à condition qu'elle soit toujours en cours, pas vide, et que le moyen de paiement (PaymentMethod)
soit valide et suffisamment approvisionné. Elle renvoie le prix total de la commande.
C'est parti !
Utilisez le protocole Error
Error
est un protocole qui définit les erreurs en Swift.
Créez les erreurs avec le protocole Error
La façon la plus classique d'utiliser ce protocole, c'est de définir une énumération qui adopte le protocole Error
. Nous allons donc définir une énumération OrderError
dans notre classe Order
comme ceci :
enum OrderError: Error {
}
Dans cette énumération, nous allons lister les différents cas d'erreur possibles dans notre code. Il va y en avoir 4 :
ajout d'un élément dans la commande alors que celle-ci est déjà payée ;
payer une commande vide ;
payer alors que la méthode de paiement n'est pas valide (carte expirée, par exemple) ;
payer au-delà du plafond de la méthode de paiement.
Nous allons exprimer tout cela dans notre énumération.
enum OrderError: Error {
case orderAlreadyPayed
case orderIsEmpty
case invalidPaymentMethod
case insufficientFundings
}
Signalez les erreurs avec throw
Dans le code, nous allons maintenant utiliser les erreurs que nous venons de créer. Pour signaler une erreur, on utilise le mot-clé throw
comme ceci :
guard status == .pending else {
throw OrderError.orderAlreadyPayed
}
Plusieurs choses à noter ici :
throw
vous fait quitter le contexte du code. Commereturn
, lorsquethrow
est appelé, on quitte la fonction.
throw
s'utilise avec une erreur. Cette erreur nous permet d'avoir une information claire sur ce qu'il s'est passé, c'est beaucoup mieux qu'unreturn 0
qui ne donne aucune explication du problème, et en plus risque d'être mal interprété.
Lorsqu'on throw
une erreur, la personne qui va utiliser ce code va devoir gérer l'erreur, sinon le code va planter. Pour prévenir qu'une fonction peut renvoyer une erreur, on doit lui ajouter le mot-clé throws
:
func pay(with paymentMethod: PaymentMethod) throws -> Double { // On ajoute throws à la déclaration
guard status == .pending else {
throw OrderError.orderAlreadyPayed
}
// (...)
}
À vous de jouer !
À vous de jouer ! Rajoutez la gestion d'erreur pour le reste de la fonction pay ! Essayez par vous-même avant de regarder la correction !
Vous pouvez consulter ce corrigé pour vérifier votre travail.
En résumé
Implémentez le protocole Error avec une énumération pour définir nos différents cas d'erreurs.
Lancez une erreur en utilisant le mot-clé
throw
suivi du type d’erreur.L'exécution de
throw
fait quitter la fonction dans laquelle il est défini.Ajoutez la mention
throws
pour toute fonction qui fait appel àthrow
.
Après avoir appris comment créer et lancer des erreurs, nous allons voir dans le prochain chapitre comment les gérer !