Menu
Coddy logo textTech

try? et try!

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 46 sur 56.

Parfois, peu importe l'erreur qu'une fonction a levée, vous voulez simplement un résultat ou une solution de repli. Swift vous propose deux formes courtes.

try? transforme toute erreur levée en nil. Le résultat est un Optional du type de retour de la fonction :

enum E: Error { case nope }
func risky() throws -> Int { throw E.nope }

let result = try? risky()        // nil
let safe   = (try? risky()) ?? 0 // 0

Associez-le à ?? pour une valeur par défaut en ligne. C'est la version la plus courte de « appelez cet élément, donnez-moi une valeur dans tous les cas ».

try! dit « Je sais que cela ne lèvera pas d'erreur ». Si c'est le cas, votre programme plante. Utilisez-le uniquement lorsque vous pouvez prouver que l'appel est sûr ; dans le code de tous les jours, préférez try? avec une solution de repli ou le bloc complet do/catch.

challenge icon

Défi

Facile

Définissez NumError: Error avec un cas bad. Définissez une fonction lançant une erreur parseEven(_ s: String) throws -> Int qui :

  • Lance .bad lorsque s ne peut pas être analysé comme un Int, ou lorsque la valeur analysée est impaire
  • Sinon, retourne l'entier analysé

Lisez une seule ligne d'entrée : une liste de chaînes de caractères séparées par des virgules. Pour chacune d'elles, utilisez try? suivi de ?? -1 pour obtenir soit l'entier pair analysé, soit -1.

Affichez, dans l'ordre, les entiers résultants joints par ,. Ensuite, sur une deuxième ligne, affichez le nombre de valeurs qui ont renvoyé -1.

Pour l'entrée 4,7,abc,8,11,2, la sortie est :

4,-1,-1,8,-1,2
3

Aide-mémoire

try? convertit une erreur levée en nil, retournant un Optional :

let result = try? risky()        // nil si une erreur est levée
let safe   = (try? risky()) ?? 0 // valeur de repli

try! provoque un plantage si l'appel lève une erreur — à n'utiliser que lorsque l'appel est garanti sûr :

let value = try! guaranteedSafe()

Essayez vous-même

let parts = readLine()!.components(separatedBy: ",")

// TODO: enum NumError; func parseEven(_:) throws -> Int;
// pour chaque partie, (try? parseEven(part)) ?? -1
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