Ruby obsługuje błędy za pomocą begin// (odpowiednik try/catch/finally w Ruby). Wyrzucasz wyjątki za pomocą i łapiesz je za pomocą , a służy do czyszczenia. Ruby pozwala również na rescue na poziomie metody (bez explicit ) dla czystszego kodu.
Ruby obsługuje błędy za pomocą begin// (odpowiednik try/catch/finally w Ruby). Wyrzucasz wyjątki za pomocą i łapiesz je za pomocą , a służy do czyszczenia. Ruby pozwala również na rescue na poziomie metody (bez explicit ) dla czystszego kodu.
rescueensureraiserescueensurebeginbegin
result = risky_operation
rescue ArgumentError => e # rescue a SPECIFIC exception type
puts "Bad argument: #{e.message}"
rescue StandardError => e # broader catch (StandardError, not Exception)
puts "Error: #{e.message}"
retry if attempts < 3 # retry can re-run the begin block
else
puts "succeeded" # runs if NO exception
ensure
cleanup # ALWAYS runs (success or failure)
end
begin/rescue/ensure to Ruby'owy try/catch/finally. Łap określone typy (rescue ArgumentError), użyj ensure do gwarantowanego czyszczenia, a else dla przypadku bez błędu. retry może ponowić blok.
rescue => e # ✅ bare rescue catches StandardError (the right default)
rescue StandardError # ✅ explicit, same thing
rescue Exception # ❌ AVOID — catches EVERYTHING including system signals
# (Interrupt/Ctrl-C, SystemExit) — can break the program
Ważne: bare rescue łapie StandardError (prawidłowe domyślne dla błędów aplikacji). Łapanie Exception (root) łapie wszystko, włącznie z sygnałami na poziomie systemu jak Interrupt (Ctrl-C) i SystemExit — czego zwykle nie chcesz łapać, bo może to uniemożliwić przerwanie programu lub prawidłowe wyjście. To częsty błąd w Ruby.
raise ArgumentError, "Amount must be positive" # raise a built-in
raise "Something failed" # raises RuntimeError
# custom exception class
class InsufficientFundsError < StandardError # inherit from StandardError
def initialize(msg = "Not enough funds")
super
end
end
raise InsufficientFundsError
def process
do_work
rescue => e # rescue WITHOUT begin — applies to the whole method body
handle(e)
ensure
cleanup
end
Prawidłowa obsługa wyjątków jest niezbędna dla niezawodnych aplikacji Ruby, a zrozumienie podejścia Ruby — włącznie z jego konkretnymi idiomami i zastrzeżeniami — jest ważne.
Struktura begin/rescue/ensure (Ruby'owy try/catch/finally), łapanie określonych typów wyjątków, używanie ensure do gwarantowanego czyszczenia oraz czysty rescue na poziomie metody (bez explicit begin) to podstawowa, codzienna wiedza.
Osobliwie ważnym i charakterystycznym dla Ruby punktem jest rozróżnienie StandardError vs Exception: bare rescue (i prawidłowe domyślne) łapie StandardError, ale łapanie Exception (root hierarchii) łapie wszystko — włącznie z sygnałami systemu jak Interrupt (Ctrl-C) i SystemExit — czego prawie nigdy nie chcesz, bo może to uniemożliwić przerwanie programu lub prawidłowe wyjście, i to jest częsty, szkodliwy błąd.
Zrozumienie, że powinieneś łapać StandardError (nie Exception) dla błędów aplikacji, to ważna, specyficzna dla Ruby wiedza, która zapobiega rzeczywistym bugom.
Znajomość struktury, niestandardowych klas wyjątków (dziedziczących po StandardError), retry, idiomy rescue na poziomie metody oraz szczególnie zastrzeżenie StandardError-not-Exception jest ważne do pisania niezawodnego, prawidłowego Ruby, który obsługuje błędy elegancko bez przerywania zdolności programu do przerwania.
Ponieważ nieobsłużone błędy i błąd Exception-rescuing'u powodują rzeczywiste problemy, opanowanie Ruby'owej obsługi wyjątków — jej struktury, idiomów oraz krytycznego rozróżnienia StandardError vs Exception — to ważna, często istotna wiedza dla niezawodnego Ruby development'u i częsty temat na rozmowach kwalifikacyjnych.