Menu
Coddy logo textTech

do, try, catch

Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 45 z 56.

Pełna forma obsługi błędów to 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 umieszcza się przed każdym wywołaniem, które może zgłosić wyjątek. Jeśli wywołanie zgłosi wyjątek, sterowanie przechodzi do pasującego bloku catch; w przeciwnym razie wykonywanie przechodzi dalej, poza blok do.

Wiele klauzul catch jest wykonywanych od góry do dołu, a pierwsza pasująca wygrywa, tak jak w przypadku switch. Samodzielna klauzula catch na końcu przechwytuje wszystkie wyjątki — prawie zawsze warto ją mieć, żeby kompilator był zadowolony.

challenge icon

Wyzwanie

Łatwy

Zdefiniuj wyliczenie ParseError: Error z trzema przypadkami: empty, notInteger i negative.

Zdefiniuj funkcję zgłaszającą błędy parsePositive(_ s: String) throws -> Int, która:

  • Zgłasza .empty, gdy ciąg s po usunięciu białych znaków jest pusty
  • Zgłasza .notInteger, gdy nie można sparsować s jako Int
  • Zgłasza .negative, gdy sparsowana wartość jest < 0
  • W przeciwnym razie zwraca sparsowaną wartość

Odczytaj jeden wiersz ze standardowego wejścia i wywołaj parsePositive w bloku do/catch. Wypisz:

  • got: <n> w przypadku powodzenia
  • error: empty, error: not integer lub error: negative dla każdego przypadku

Dla wejścia 42 wynikiem jest got: 42. Dla pustego wiersza wynikiem jest error: empty. Dla abc wynikiem jest error: not integer.

Spróbuj swoich sił

let line = readLine()!

// TODO: enum ParseError; func parsePositive(_:) throws -> Int;
// do/try/catch z trzema gałęziami oraz gałęzią obsługującą wszystkie pozostałe przypadki
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Logika i przepływ programu

Poćwicz samodzielnie: Edytor online Swift