throws et Error
Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 44 sur 56.
Swift gère les erreurs en obligeant les fonctions à déclarer qu'elles peuvent échouer. Le corps de la fonction lève une valeur d'erreur ; l'appelant doit la gérer.
Un type d'erreur est tout ce qui se conforme au protocole intégré Error. La manière la plus simple de déclarer le vôtre est d'utiliser une énumération :
enum InputError: Error {
case empty
case tooLong
}Une fonction lançant une erreur utilise le mot-clé throws dans sa signature et l'instruction throw dans son corps :
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Vous ne pouvez pas appeler directement une fonction qui lève une erreur, le compilateur vous oblige à gérer l'erreur. La leçon suivante explique comment.
Défi
FacileDéfinissez une énumération NumError: Error avec deux cas : negative et tooBig.
Définissez une fonction lançant des erreurs doubleSafely(_ n: Int) throws -> Int qui :
- Lance
.negativequandn < 0 - Lance
.tooBigquandn > 100 - Sinon, retourne
n * 2
Lisez un seul entier depuis stdin. Appelez doubleSafely à l'intérieur d'un bloc do/catch (vous apprendrez la forme exacte lors de la prochaine leçon ; pour l'instant, utilisez ce squelette exact) :
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}Pour l'entrée 10, la sortie est ok: 20. Pour -1, c'est negative. Pour 500, c'est too big.
Aide-mémoire
Définissez les types d'erreurs à l'aide d'une énumération conforme à Error :
enum InputError: Error {
case empty
case tooLong
}Marquez une fonction comme pouvant lever une erreur avec throws et utilisez throw pour lever une erreur :
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Les fonctions qui lèvent des erreurs doivent être appelées avec une gestion d'erreurs (par exemple do/catch) ; le compilateur impose cette règle.
Essayez vous-même
let n = Int(readLine()!)!
// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.
Toutes les leçons de Logique et Flux
1Les chaînes de caractères en profondeur
Comptage et indicesCasse et nettoyageRecherche dans les chaînesDécoupage et jointureRemplacement de sous-chaînesRécapitulatif - Vérification du nom d'utilisateur4Ensembles
Création d'ensemblesUnion et intersectionSoustraction et différence symétriqueSous-ensemble et sur-ensembleRécapitulatif - Filtre de tags7Projet - Suivi d'habitudes
Aperçu du projetMarquer comme terminé10Projet - Moteur de quiz
Présentation du projetPoser des questions2Intervalles et Pas
Fermé vs Semi-ouvertLe PasMéthodes d'intervalleIntervalles dans un SwitchRécapitulatif - Grille de calendrier5Fonctions d'ordre supérieur, Partie 1
MapFilterReduceChaînage de map, filter, reduceRécapitulatif - Statistiques de mots3Dictionnaires
Déclarer des dictionnairesRecherche optionnelleMettre à jour des dictionnairesParcourir des dictionnairesGrouper des valeursRécapitulatif - Inventaire6Fonctions d'ordre supérieur, partie 2
compactMapflatMapsorted(by:)Construction de pipelinesRécapitulatif - Tableau de classement9Gestion des erreurs
throws et Errordo, try, catchtry? et try!Propagation des erreursRécapitulatif - Calculatrice sécurisée