Swift Academy · Leçon

defer avec les erreurs et les retours anticipés

Garantissez le nettoyage, même en cas d’exception ou de retour anticipé.

Leçon 4 sur 413 étapes

defer avec les erreurs et les retours anticipés est une leçon Swift Academy gratuite sur CoddyKit. Ceci est la leçon 4 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Swift Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Swift Academy comprend 4 leçons au total.

defer s'exécute lors d'un return

Un bloc defer s'exécute même lorsque la fonction se termine prématurément via return.

func check(_ value: Int) {
    defer { print("cleanup ran") }
    if value < 0 {
        print("negative, returning early")
        return
    }
    print("value is", value)
}
check(-5)

Nettoyage sur chaque chemin

Quel que soit le return déclenché, le nettoyage différé s'exécute exactement une fois.

func classify(_ n: Int) {
    defer { print("done classifying") }
    if n == 0 { print("zero"); return }
    if n > 0 { print("positive"); return }
    print("negative")
}
classify(0)

defer s'exécute lors d'un throw

Lorsqu'une fonction lève une erreur, les defer enregistrés s'exécutent tout de même pendant le déroulement de la portée.

enum MyError: Error { case bad }
func risky(_ fail: Bool) throws {
    defer { print("cleanup on the way out") }
    if fail { throw MyError.bad }
    print("no failure")
}
try? risky(true)

Combiner return et throw

Que la fonction se termine normalement ou lève une erreur, le même defer s'exécute.

enum E: Error { case oops }
func op(_ flag: Bool) throws -> Int {
    defer { print("op finishing") }
    if flag { throw E.oops }
    return 42
}
let r = try? op(false)
print(r ?? -1)

Nettoyage avant la propagation de l'erreur

Le defer s'exécute avant que l'erreur levée n'atteigne l'appelant ; les resources sont donc libérées en premier.

enum E: Error { case fail }
func load(_ broken: Bool) throws {
    print("open")
    defer { print("close") }
    if broken { throw E.fail }
    print("read")
}
do {
    try load(true)
} catch {
    print("caught:", error)
}

Protéger avec guard

Un schéma courant consiste à acquérir une ressource, à différer le nettoyage, puis à utiliser guard avec des retours prématurés qui déclenchent tout de même le nettoyage.

func process(_ items: [Int]) {
    print("start")
    defer { print("finished") }
    guard !items.isEmpty else {
        print("nothing to do")
        return
    }
    print("processing", items.count, "items")
}
process([])

defer et boucles avec throw

Un defer placé dans une boucle s'exécute à la fin de chaque itération, même si une instruction ultérieure lève une erreur.

enum E: Error { case stop }
func loop() throws {
    for i in 1...3 {
        defer { print("end", i) }
        if i == 2 { throw E.stop }
        print("body", i)
    }
}
try? loop()

Ordre lors d'un retour prématuré

Plusieurs defer s'exécutent toujours dans l'ordre LIFO lors d'un retour prématuré.

func multi(_ skip: Bool) {
    defer { print("A") }
    defer { print("B") }
    if skip { return }
    print("body")
}
multi(true)

Journalisation en cas d'échec

Utilisez defer pour journaliser systématiquement la réussite ou l'échec sur tous les chemins de sortie.

enum E: Error { case bad }
func attempt(_ fail: Bool) throws {
    var success = false
    defer { print("attempt success:", success) }
    if fail { throw E.bad }
    success = true
}
try? attempt(true)

Restauration du state lors d'un throw

defer convient parfaitement pour restaurer un state temporaire lorsqu'une opération lève une erreur.

enum E: Error { case fail }
func transaction(_ fail: Bool) throws {
    var inProgress = true
    defer { inProgress = false; print("inProgress:", inProgress) }
    if fail { throw E.fail }
    print("committed")
}
try? transaction(true)

Bonne pratique

Fiez-vous à defer pour les nettoyages qui doivent être effectués malgré les retours prématurés et les erreurs levées, afin qu'aucun chemin de sortie ne laisse de resources non libérées.

enum E: Error { case x }
func safe(_ fail: Bool) throws {
    print("acquire")
    defer { print("release") }
    if fail { throw E.x }
    print("use")
}
try? safe(true)

Vérification rapide

Vérifiez defer avec des erreurs et des retours.

Récapitulatif

defer s'exécute à chaque sortie de portée, y compris lors d'un return prématuré ou d'une erreur levée, avant la propagation de l'erreur. Il constitue ainsi l'emplacement fiable pour le nettoyage et la restauration du state sur tous les chemins de sortie, tout en conservant l'ordre LIFO.

func f(_ skip: Bool) {
    defer { print("cleanup") }
    if skip { return }
    print("work")
}
f(true)
Gratuit pour commencer

Apprends Swift avec un tuteur IA — gratuit

Écris et exécute du vrai code dans ton navigateur, obtiens de l'aide instantanée d'un tuteur IA disponible 24h/24, et reprends là où tu t'es arrêté sur le web ou dans l'app.

Cours
122
Leçons
409

Questions Fréquemment Posées

La leçon « defer avec les erreurs et les retours anticipés » est-elle gratuite ?

Oui — le texte complet de « defer avec les erreurs et les retours anticipés » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Swift Academy, passe à CoddyKit PRO. Le cours Swift Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « defer avec les erreurs et les retours anticipés » ?

Garantissez le nettoyage, même en cas d’exception ou de retour anticipé. Tu pratiques Swift Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Swift Academy ?

Aucune expérience préalable n'est requise. Swift Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 4 sur 4.

Combien de temps prend la leçon « defer avec les erreurs et les retours anticipés » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Swift Academy ?

Oui. Chaque leçon Swift Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Fonctionnement de defer
  2. Ordre de plusieurs blocs defer
  3. defer pour libérer les ressources
  4. defer avec les erreurs et les retours anticipés
← Retour à Swift Academy