Menu
Coddy logo textTech

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.

challenge icon

Défi

Facile

Dé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 .negative quand n < 0
  • Lance .tooBig quand n > 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 { ... } ...
quiz iconTestez-vous

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