ensure i raise
Część sekcji Logika i przepływ programu ścieżki Ruby w Coddy. Lekcja 46 z 56.
Jeszcze dwa elementy uzupełniają zestaw narzędzi do obsługi błędów.
ensure to blok, który wykonuje się bez względu na wszystko — niezależnie od tego, czy begin zakończył się normalnie, czy gałąź rescue przechwyciła wyjątek, a nawet jeśli wyjątek nie został przechwycony. To tutaj umieszczasz kod porządkowy:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# otwieranie pliku
# wyjątek przechwycony
# zamykanie plikuraise służy do tworzenia własnych wyjątków. Przekaż ciąg znaków z komunikatem albo klasę i komunikat:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... wykonaj wypłatę
endPrzyjęło się, że wyjątek należy zgłaszać wcześnie, na początku metody, aby szybko zakończyć działanie, gdy argumenty są nieprawidłowe. Wywołujący może przechwycić wyjątek, jeśli ma sensowny sposób na odzyskanie działania, albo pozwolić mu propagować się dalej.
Wyzwanie
ŁatwyZdefiniuj metodę safe_divide(a, b), która:
- Zgłasza
ArgumentErrorz komunikatem"b cannot be zero", jeślib == 0 - W przeciwnym razie zwraca
a / b
Następnie odczytaj z wejścia dwie liczby całkowite. Wywołaj safe_divide wewnątrz begin / rescue / ensure:
- W przypadku powodzenia wypisz
Result: <value> - W przypadku
ArgumentErrorwypiszError: <message> - W bloku
ensurezawsze wypiszDone.
Dla wejścia 10 / 2 wynikiem jest:
Result: 5
Done.Dla wejścia 10 / 0:
Error: b cannot be zero
Done.Spróbuj swoich sił
# TODO: zdefiniuj safe_divide(a, b), zgłasza ArgumentError, gdy b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... wypisz Result; rescue ArgumentError => e ... wypisz Error; ensure ... wypisz Done.
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
1Łańcuchy znaków w szczegółach
Przegląd metod łańcuchów znakówInterpolacja łańcuchów znakówIterowanie po łańcuchach znakówDzielenie i łączeniePowtórka – Tkacz łańcuchów znaków4Bloki, procki i lambdy
Czym jest blok?do..end a nawiasy klamroweSłowo kluczowe yieldParametry blokuProcki i lambdyPodsumowanie — własny iterator7Hashe, część 2
Hash.new z wartościami domyślnymiIterowanie po haszachZagnieżdżone haszeŁączenie i przekształcaniePowtórka — licznik częstotliwości10Projekt – ewidencja uczniów
Przegląd projektuDodawanie ucznia5Potęga Enumerable
Select i RejectŁączenie wywołań mapReduce / Injectcount, all?, any?, none?group_by i partitionsort_by, min_by, max_byPodsumowanie — potok danych8Zaawansowane podejmowanie decyzji
case z klasami i wyrażeniami regularnymiwhen z wieloma wartościamiOperator trójargumentowyInline if / unlessPowtórka – klasyfikator ocen3Tablice 2D
Podstawy tablic 2DDostęp do elementów tablic 2DIterowanie po tablicach 2DTypowe wzorce 2DPowtórzenie – operacje na macierzach6Projekt – Menedżer biblioteki
Przegląd projektuDodaj książkę9Obsługa błędów
Czym jest wyjątek?begin / rescueWiele klauzul rescueensure i raisePodsumowanie — bezpieczny kalkulatorPoćwicz samodzielnie: Kompilator Ruby online