throws und Error
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy — Lektion 44 von 56.
Swift behandelt Fehler, indem Funktionen deklarieren, dass sie fehlschlagen können. Der Funktionskörper wirft einen Fehlerwert; der Aufrufer muss diesen behandeln.
Ein Fehlertyp ist alles, was dem integrierten Error-Protokoll entspricht. Der einfachste Weg, einen eigenen zu deklarieren, ist mit einem Enum:
enum InputError: Error {
case empty
case tooLong
}Eine fehlerwerfende Funktion verwendet das Schlüsselwort throws in ihrer Signatur und die throw-Anweisung in ihrem Funktionskörper:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Sie können eine fehlerwerfende Funktion nicht direkt aufrufen; der Compiler zwingt Sie dazu, den Fehler zu behandeln. Die nächste Lektion erklärt, wie.
Aufgabe
EinfachDefiniere ein Enum NumError: Error mit zwei Cases: negative und tooBig.
Definiere eine Throwing-Function doubleSafely(_ n: Int) throws -> Int, die:
.negativewirft, wennn < 0.tooBigwirft, wennn > 100- Andernfalls
n * 2zurückgibt
Lies einen einzelnen Integer von stdin ein. Rufe doubleSafely innerhalb eines do/catch-Blocks auf (die genaue Form lernst du in der nächsten Lektion; verwende vorerst dieses exakte Skelett):
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}Für die Eingabe 10 ist die Ausgabe ok: 20. Für -1 ist sie negative. Für 500 ist sie too big.
Spickzettel
Definieren Sie Fehlertypen mit einem Enum, das Error entspricht:
enum InputError: Error {
case empty
case tooLong
}Markieren Sie eine Funktion mit throws als werfend und verwenden Sie throw, um einen Fehler auszulösen:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Werfende Funktionen müssen mit Fehlerbehandlung aufgerufen werden (z. B. do/catch); der Compiler erzwingt dies.
Probier es selbst
let n = Int(readLine()!)!
// TODO: enum NumError: Error { case negative, tooBig }
// func doubleSafely(_ n: Int) throws -> Int { ... }
// do { let r = try doubleSafely(n); ... } catch NumError.negative { ... } ...
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