0Pricing
Swift Academy · Lektion

defer mit Fehlern und vorzeitigen Rückgaben

Stellen Sie die Bereinigung auch bei Fehlern oder vorzeitigen Rückgaben sicher.

defer mit Fehlern und vorzeitigen Rückgaben ist eine kostenlose Swift Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des Swift Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

defer wird bei return ausgeführt

Ein defer-Block wird auch dann ausgeführt, wenn die Funktion vorzeitig über return endet.

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

Aufräumen auf jedem Pfad

Unabhängig davon, welches return ausgeführt wird, läuft das zurückgestellte Aufräumen genau einmal.

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 wird bei throw ausgeführt

Wenn eine Funktion einen Fehler auslöst, werden registrierte defers weiterhin ausgeführt, während der Gültigkeitsbereich abgewickelt wird.

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)

return und throw kombinieren

Unabhängig davon, ob die Funktion normal zurückkehrt oder einen Fehler auslöst, wird dasselbe defer ausgeführt.

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)

Aufräumen vor der Fehlerweitergabe

Das defer wird ausgeführt, bevor der ausgelöste Fehler den Aufrufer erreicht. Dadurch werden die Ressourcen zuerst freigegeben.

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)
}

Mit defer absichern

Ein gängiges Muster: Ressource erwerben, das Aufräumen mit defer zurückstellen und anschließend mit guard und vorzeitigen Rückgaben arbeiten, die das Aufräumen trotzdem auslösen.

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 und Schleifen mit Fehlern

Ein defer innerhalb einer Schleife wird am Ende jeder Iteration ausgeführt, auch wenn eine spätere Anweisung einen Fehler auslöst.

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()

Reihenfolge bei vorzeitiger Rückkehr

Mehrere defers werden auch bei einer vorzeitigen Rückkehr in LIFO-Reihenfolge ausgeführt.

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

Bei Fehlern protokollieren

Verwenden Sie defer, um Abschluss oder Fehler auf allen Beendigungspfaden einheitlich zu protokollieren.

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)

Zustand bei throw wiederherstellen

defer eignet sich ideal, um einen vorübergehend geänderten Zustand wiederherzustellen, wenn eine Operation einen Fehler auslöst.

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)

Bewährte Vorgehensweise

Verlassen Sie sich für Aufräumarbeiten, die vorzeitige Rückgaben und ausgelöste Fehler überstehen müssen, auf defer, damit kein Beendigungspfad Ressourcen zurücklässt.

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)

Kurztest

Testen Sie defer mit Fehlern und Rückgaben.

Zusammenfassung

defer wird bei jedem Verlassen des Gültigkeitsbereichs ausgeführt, einschließlich einer vorzeitigen Rückgabe mit return und eines ausgelösten Fehlers, und zwar bevor der Fehler weitergegeben wird. Damit ist es der zuverlässige Ort für Aufräumen und das Wiederherstellen des Zustands auf allen Beendigungspfaden, wobei die LIFO-Reihenfolge erhalten bleibt.

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

Häufig gestellte Fragen

Ist die Lektion „defer mit Fehlern und vorzeitigen Rückgaben“ kostenlos?

Ja — der vollständige Text von „defer mit Fehlern und vorzeitigen Rückgaben“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Swift Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Swift Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „defer mit Fehlern und vorzeitigen Rückgaben“?

Stellen Sie die Bereinigung auch bei Fehlern oder vorzeitigen Rückgaben sicher. Du übst Swift Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um Swift Academy zu starten?

Keine Vorkenntnisse erforderlich. Swift Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.

Wie lange dauert die Lektion „defer mit Fehlern und vorzeitigen Rückgaben“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser Swift Academy-Lektion Code schreiben und ausführen?

Ja. Jede Swift Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Funktionsweise von defer
  2. Reihenfolge mehrerer defer-Blöcke
  3. defer zur Ressourcenbereinigung
  4. defer mit Fehlern und vorzeitigen Rückgaben
← Zurück zu Swift Academy