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.
Aufgabe
MittelErstellen 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 Erfolgnegative, wennparseSafeeinen Fehler geworfen hattoo big, wenncapStricteinen Fehler geworfen hat
Für die Eingabe 10,-1,200,42 lautet die Ausgabe:
ok: 10
negative
too big
ok: 42Spickzettel
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
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.
Alle Lektionen in Logik & Kontrollfluss
1Strings im Detail
Zählen und IndizesGroß-/Kleinschreibung und TrimmenSuchen in StringsTeilen und ZusammenfügenTeilstrings ersetzenWiederholung – Benutzernamen-Check4Mengen
Mengen erstellenVereinigung und SchnittmengeDifferenz und symmetrische DifferenzTeilmenge und ObermengeRückblick – Tag-Filter7Projekt - Habit Tracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteRange-MethodenRanges in SwitchRückblick – Kalender-Grid5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerkettung von map, filter, reduceRückblick – Wortstatistiken3Dictionaries
Dictionaries deklarierenOptionaler LookupDictionaries aktualisierenÜber Dictionaries iterierenWerte gruppierenZusammenfassung – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenZusammenfassung – Bestenliste9Fehlerbehandlung
throws und Errordo, try, catchtry? und try!Fehler weitergebenZusammenfassung – Sicherer Taschenrechner