Ruby obravnava napake z (Ruby-jev ekvivalent try/catch/finally). Izjeme sprožiš z in jih ujameš z , medtem ko je namenjen čiščenju. Ruby omogoča tudi na ravni metode (brez eksplicitnega ) za bolj čit kodo.
Ruby obravnava napake z (Ruby-jev ekvivalent try/catch/finally). Izjeme sprožiš z in jih ujameš z , medtem ko je namenjen čiščenju. Ruby omogoča tudi na ravni metode (brez eksplicitnega ) za bolj čit kodo.
begin/rescue/ensureraiserescueensurerescuebeginbegin
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-jev try/catch/finally. Ujami specifične vrste izjem (rescue ArgumentError), uporabi ensure za zagotovljeno čiščenje, in else za primer brez napake. retry lahko ponovno poskusi 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
Pomembno: goli rescue ujame StandardError (pravilna privzeta možnost za napake v aplikaciji). Ujemanje Exception (korena) ujame vse, vključno s signali na sistemski ravni, kot je Interrupt (Ctrl-C) in SystemExit — ki jih običajno ne želiš ujeti, saj lahko prepreči prekinjenje ali pravilno izhod programa. To je pogosta Ruby napaka.
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
Pravilna obravnavanje izjem je bistvena za robustne Ruby aplikacije, in razumevanje Ruby-jevega pristopa — vključno z njegovimi posebnimi idiomi in caveat-i — je pomembno.
Strukturo begin/rescue/ensure (Ruby-jev try/catch/finally), ujemanje specifičnih vrst izjem, uporaba ensure za zagotovljeno čiščenje, in čista rescue na ravni metode (brez eksplicitnega begin) so temeljno vsakodnevno znanje.
Posebno pomembna in značilna Ruby točka je razlika med StandardError in Exception: goli rescue (in pravilna privzeta možnost) ujame StandardError, vendar ujemanje Exception (korena hierarhije) ujame vse — vključno s sistemskimi signali, kot sta Interrupt (Ctrl-C) in SystemExit — kar skoraj nikoli ne želiš, saj lahko prepreči prekinjenje programa ali njegov pravilni izhod, in je pogosta, škodljiva napaka.
Razumevanje, da bi moral ujeti StandardError (ne Exception) za napake v aplikaciji, je pomembno Ruby-specifično znanje, ki prepreči prave napake.
Znanje strukture, lastnih razredov izjem (dedovanje od StandardError), retry, idioma rescue na ravni metode, in zlasti razlika StandardError-ne-Exception je pomembno za pisanje robustnega, pravilnega Ruby-ja, ki obravnava napake elegantno, ne da bi poškodoval sposobnost prekinitve programa.
Ker neobdelane napake in napaka ujemanja Exception povzročata prave probleme, je obvladovanje Ruby-jevega obravnavanja izjem — njegove strukture, idiomov in kritične razlike StandardError in Exception — pomembno, pogosto relevantno znanje za zanesljiv Ruby razvoj in pogosta tema na razgovorih.