Ruby zpracovává chyby pomocí begin/rescue/ (ekvivalent try/catch/finally). Vyvoláváte výjimky pomocí a zachytáváte je pomocí , přičemž slouží k čištění. Ruby také umožňuje rescue na úrovni metody (bez explicitního ) pro čistší kód.
Ruby zpracovává chyby pomocí begin/rescue/ (ekvivalent try/catch/finally). Vyvoláváte výjimky pomocí a zachytáváte je pomocí , přičemž slouží k čištění. Ruby také umožňuje rescue na úrovni metody (bez explicitního ) pro čistší kód.
ensureraiserescueensurebeginbegin
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 je Ruby's try/catch/finally. Zachytávejte specifické typy (rescue ArgumentError), použijte ensure na zaručené čištění a else pro případ bez chyby. retry může znovu spustit 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
Důležité: голý rescue zachytává StandardError (správný výchozí stav pro chyby aplikace). Zachytávání Exception (kořen) zachytává všechno, včetně signálů na úrovni systému jako Interrupt (Ctrl+C) a SystemExit — což obvykle nechcete zachytávat, protože to může zabránit přerušení programu nebo jeho správnému ukončení. Běžná Ruby chyba.
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
Správné zpracování výjimek je nezbytné pro robustní Ruby aplikace a pochopení Ruby přístupu — včetně jeho specifických idiomů a výhrad — je důležité.
Struktura begin/rescue/ensure (Ruby's try/catch/finally), zachytávání specifických typů výjimek, použití ensure na zaručené čištění a čistý rescue na úrovni metody (bez explicitního begin) jsou každodenní základní znalosti.
Obzvláště důležitým a výlučně Ruby bodem je rozlišení StandardError vs Exception: голý rescue (a správný výchozí stav) zachytává StandardError, ale zachytávání Exception (kořen hierarchie) zachytává všechno — včetně systémových signálů jako Interrupt (Ctrl+C) a SystemExit — což téměř nikdy nechcete, protože to může zabránit přerušení programu nebo jeho správnému ukončení a je to běžná, škodlivá chyba.
Porozumění tomu, že byste měli zachytávat StandardError (ne Exception) pro chyby aplikace, je důležitá Ruby specifická znalost, která zabraňuje skutečným chybám.
Znalost struktury, vlastních tříd výjimek (dědících z StandardError), retry, idiomů rescue na úrovni metody a zejména výhrady StandardError-ne-Exception je důležitá pro psaní robustního, správného Ruby, který zpracovává chyby elegantně bez poškozování schopnosti programu být přerušen.
Protože neohlášené chyby a chyba Exception-rescuing způsobují reálné problémy, zvládnutí Ruby zpracování výjimek — jeho struktura, idiomy a kritické rozlišení StandardError vs Exception — je důležitá, často relevantní znalost pro spolehlivý Ruby vývoj a běžné téma v pohovorech.