Menu
Coddy logo textTech

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.

challenge icon

Aufgabe

Einfach

Definiere ein Enum NumError: Error mit zwei Cases: negative und tooBig.

Definiere eine Throwing-Function doubleSafely(_ n: Int) throws -> Int, die:

  • .negative wirft, wenn n < 0
  • .tooBig wirft, wenn n > 100
  • Andernfalls n * 2 zurü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 { ... } ...
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