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. Am einfachsten deklarierst du deinen eigenen 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 Fällen: negative und tooBig.
Definiere eine Funktion, die Fehler auslösen kann: doubleSafely(_ n: Int) throws -> Int und die:
.negativeauslöst, wennn < 0.tooBigauslöst, wennn > 100- andernfalls
n * 2zurückgibt
Lies eine einzelne Ganzzahl von stdin ein. Rufe doubleSafely innerhalb eines do/catch-Blocks auf (die genaue Form lernst du in der nächsten Lektion; verwende vorerst genau dieses Grundgerüst):
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}Bei der Eingabe 10 lautet die Ausgabe ok: 20. Bei -1 lautet sie negative. Bei 500 lautet sie too big.
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 TrimSuchen in StringsAufteilen und ZusammenfügenTeilstrings ersetzenRückblick – Benutzernamen prüfen4Mengen
Mengen erstellenVereinigung und SchnittmengeSubtraktion und symmetrische DifferenzTeilmenge und ObermengeWiederholung – Tag-Filter7Projekt – Gewohnheitstracker
ProjektübersichtAls erledigt markieren2Bereiche & Schrittweiten
Geschlossen vs. halboffenSchrittweiteBereichsmethodenBereiche in SwitchRückblick – Kalender-Raster5Funktionen höherer Ordnung Teil 1
MapFilterReduceVerketten von Map, Filter und ReduceRückblick – Wortstatistik3Wörterbücher
Wörterbücher deklarierenOptionale SucheWörterbücher aktualisierenWörterbücher durchlaufenWerte gruppierenRückblick – Inventar6Funktionen höherer Ordnung Teil 2
compactMapflatMapsorted(by:)Pipelines erstellenRückblick – Bestenliste9Fehlerbehandlung
throws und Errordo, try, catchtry? und try!Fehler weitergebenRückblick – Sicherer RechnerÜbe selbstständig: Swift-Playground