throws i Error
Część sekcji Logika i przepływ programu ścieżki Swift w Coddy. Lekcja 44 z 56.
Swift obsługuje błędy, wymagając od funkcji zadeklarowania, że mogą zakończyć się niepowodzeniem. Treść funkcji zgłasza wartość błędu; wywołujący ją kod musi go obsłużyć.
Typ błędu to wszystko, co jest zgodne z wbudowanym protokołem Error. Najprościej zadeklarować własny typ za pomocą enuma:
enum InputError: Error {
case empty
case tooLong
}Funkcja zgłaszająca błędy używa słowa kluczowego throws w swojej sygnaturze i instrukcji throw w swoim ciele:
func validate(_ s: String) throws -> String {
if s.isEmpty { throw InputError.empty }
if s.count > 100 { throw InputError.tooLong }
return s
}Nie możesz wywołać funkcji, która może zgłosić błąd, bezpośrednio — kompilator wymaga, aby obsłużyć ten błąd. W następnej lekcji dowiesz się, jak to zrobić.
Wyzwanie
ŁatwyZdefiniuj wyliczenie NumError: Error z dwoma przypadkami: negative i tooBig.
Zdefiniuj funkcję zgłaszającą błędy doubleSafely(_ n: Int) throws -> Int, która:
- Zgłasza
.negative, gdyn < 0 - Zgłasza
.tooBig, gdyn > 100 - W przeciwnym razie zwraca
n * 2
Wczytaj jedną liczbę całkowitą ze stdin. Wywołaj doubleSafely wewnątrz bloku do/catch (dokładną składnię poznasz na następnej lekcji; na razie użyj dokładnie tego szkieletu):
do {
let result = try doubleSafely(n)
print("ok: \(result)")
} catch NumError.negative {
print("negative")
} catch NumError.tooBig {
print("too big")
} catch {
print("unknown")
}Dla danych wejściowych 10 wynikiem jest ok: 20. Dla -1 wynikiem jest negative. Dla 500 wynikiem jest too big.
Spróbuj swoich sił
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 { ... } ...
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