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.
Wyzwanie
ŁatwyZdefiniuj 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ągspo usunięciu białych znaków jest pusty - Zgłasza
.notInteger, gdy nie można sparsowaćsjakoInt - 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 powodzeniaerror: empty,error: not integerluberror: negativedla 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
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
1Dogłębnie o ciągach znaków
Liczba i indeksyWielkość liter i usuwanie białych znakówWyszukiwanie w ciągach znakówDzielenie i łączenieZastępowanie podciągówPodsumowanie — sprawdzanie nazwy użytkownika4Zbiory
Tworzenie zbiorówSuma i część wspólnaRóżnica i różnica symetrycznaPodzbiór i nadzbiórPowtórka — filtr tagów7Projekt – Śledzenie nawyków
Przegląd projektuOznacz jako wykonane10Projekt — silnik quizów
Przegląd projektuZadawanie pytań2Zakresy i kroki
Zakresy domknięte i półotwarteKrokMetody zakresówZakresy w instrukcji switchPowtórka — siatka kalendarza5Funkcje wyższego rzędu, część 1
MapFilterReduceŁączenie map, filter i reducePodsumowanie – statystyki słów3Słowniki
Deklarowanie słownikówWyszukiwanie opcjonalneAktualizowanie słownikówIterowanie po słownikachGrupowanie wartościPodsumowanie – inwentarz6Funkcje wyższego rzędu, cz. 2
compactMapflatMapsorted(by:)Tworzenie potokówPowtórzenie – tabela wyników9Obsługa błędów
throws i Errordo, try, catchtry? i try!Przekazywanie błędówPowtórka — bezpieczny kalkulatorPoćwicz samodzielnie: Edytor online Swift