Menu
Coddy logo textTech

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 pliku

raise 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ę
end

Przyjęł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.

challenge icon

Wyzwanie

Łatwy

Zdefiniuj metodę safe_divide(a, b), która:

  • Zgłasza ArgumentError z komunikatem "b cannot be zero", jeśli b == 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 ArgumentError wypisz Error: <message>
  • W bloku ensure zawsze wypisz Done.

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.
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: Kompilator Ruby online