Menu
Coddy logo textTech

Fehler weitergeben

Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 47 von 56.

Eine throwing function kann andere throwing functions aufrufen. Der Fehler propagiert automatisch bis zum nächsten do/catch, ein manuelles erneutes Werfen ist nicht erforderlich.

enum AuthError: Error { case badUser, badPass }

func loadUser(_ name: String) throws -> String {
    if name.isEmpty { throw AuthError.badUser }
    return name
}

func login(_ name: String, _ pass: String) throws -> String {
    let u = try loadUser(name)            // leitet den Fehler weiter
    if pass.count < 4 { throw AuthError.badPass }
    return "hello \(u)"
}

do {
    print(try login("", "abcd"))
} catch AuthError.badUser {
    print("missing user")
} catch AuthError.badPass {
    print("weak password")
}

Von oben nach unten lesen: login ruft loadUser mit try auf. Wenn loadUser einen Fehler wirft, überspringt der Fehler den Body von login und landet beim äußeren catch. Sie schreiben jeden Schritt so, dass er frühzeitig fehlschlägt (fail fast), und lassen den Aufrufer entscheiden, was zu tun ist.

challenge icon

Aufgabe

Mittel

Erstellen Sie eine kleine Pipeline aus zwei Schritten, die Fehler werfen können.

Definieren Sie StepError: Error mit zwei Fällen: negative, tooBig.

Definieren Sie parseSafe(_ s: String) throws -> Int: wirft .negative, wenn der parste Integer kleiner als 0 ist, andernfalls wird er zurückgegeben. (Nehmen Sie an, dass die Eingabe parst, das wurde bereits an anderer Stelle behandelt.)

Definieren Sie capStrict(_ n: Int) throws -> Int: wirft .tooBig, wenn n > 100, andernfalls wird n zurückgegeben.

Definieren Sie processStep(_ s: String) throws -> Int, das parseSafe und dann capStrict aufruft und dabei alle Fehler weitergibt.

Lesen Sie eine einzelne Eingabezeile: eine durch Kommas getrennte Liste von Strings. Rufen Sie für jeden String processStep in einem do/catch-Block auf und geben Sie jeweils eine Zeile aus:

  • ok: <n> bei Erfolg
  • negative, wenn parseSafe einen Fehler geworfen hat
  • too big, wenn capStrict einen Fehler geworfen hat

Für die Eingabe 10,-1,200,42 lautet die Ausgabe:

ok: 10
negative
too big
ok: 42

Spickzettel

Eine fehlerwerfende Funktion kann andere fehlerwerfende Funktionen mit try aufrufen. Fehler pflanzen sich automatisch bis zum nächsten do/catch fort:

enum AuthError: Error { case badUser, badPass }

func loadUser(_ name: String) throws -> String {
    if name.isEmpty { throw AuthError.badUser }
    return name
}

func login(_ name: String, _ pass: String) throws -> String {
    let u = try loadUser(name)   // Fehler pflanzt sich nach oben fort, falls er geworfen wird
    if pass.count < 4 { throw AuthError.badPass }
    return "hello \(u)"
}

do {
    print(try login("", "abcd"))
} catch AuthError.badUser {
    print("missing user")
} catch AuthError.badPass {
    print("weak password")
}

Wenn loadUser einen Fehler wirft, überspringt die Ausführung den Rest von login und landet direkt beim äußeren catch. Ein manuelles erneutes Werfen ist nicht erforderlich.

Probier es selbst

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

// TODO: enum StepError; parseSafe; capStrict; processStep;
// für jeden Teil, do/try processStep, fange jeden Zweig ab, drucke
quiz iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Logik & Kontrollfluss