do, try, catch
Teil des Abschnitts Logik & Kontrollfluss der Swift-Journey von Coddy. Lektion 45 von 56.
Die vollständige Form zur Fehlerbehandlung ist do/try/catch:
enum DivError: Error { case byZero }
func divide(_ a: Int, _ b: Int) throws -> Int {
if b == 0 { throw DivError.byZero }
return a / b
}
do {
let r = try divide(10, 2)
print(r) // 5
} catch DivError.byZero {
print("can't divide by zero")
} catch {
print("unknown error")
}try steht vor jedem Aufruf, der einen Fehler auslösen kann. Wenn der Aufruf einen Fehler auslöst, springt die Steuerung zum passenden catch; andernfalls wird die Ausführung hinter dem do-Block fortgesetzt.
Mehrere catch-Blöcke werden von oben nach unten abgearbeitet und der erste Treffer gewinnt, genau wie bei einem switch. Der einfache catch am Ende ist der Auffangblock (catch-all); man möchte fast immer einen haben, um den Compiler zufriedenzustellen.
Aufgabe
EinfachDefiniere ein Enum ParseError: Error mit drei Fällen: empty, notInteger und negative.
Definiere eine Funktion mit Fehlerbehandlung parsePositive(_ s: String) throws -> Int, die:
.emptyauslöst, wennsohne Leerzeichen nur aus Leerraum besteht.notIntegerauslöst, wennsnicht alsIntgeparst werden kann.negativeauslöst, wenn der geparste Wert< 0ist- andernfalls den geparsten Wert zurückgibt
Lies eine einzelne Zeile von stdin ein und rufe parsePositive in einem do/catch-Block auf. Gib Folgendes aus:
got: <n>bei Erfolgerror: empty,error: not integerodererror: negativefür den jeweiligen Fall
Für die Eingabe 42 lautet die Ausgabe got: 42. Für eine leere Zeile lautet sie error: empty. Für abc lautet sie error: not integer.
Probier es selbst
let line = readLine()!
// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch mit drei Zweigen plus dem Catch-all
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