Ruby håndterer fejl med begin/rescue/ (Rubys ækvivalent til try/catch/finally). Du undtagelser og dem, med til oprydning. Ruby tillader også metode-niveau rescue (uden eksplicit ) for renere kode.
Ruby håndterer fejl med begin/rescue/ (Rubys ækvivalent til try/catch/finally). Du undtagelser og dem, med til oprydning. Ruby tillader også metode-niveau rescue (uden eksplicit ) for renere kode.
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 er Rubys try/catch/finally. Rescue specifikke typer (rescue ArgumentError), brug ensure til garanteret oprydning, og else til tilfældet uden fejl. retry kan genprøve blokken.
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
Vigtigt: et bartsøgende rescue fanger StandardError (den korrekte standard for applikationsfejl). Hvis du rescuer Exception (roden), fanger du alt, herunder systemniveausignaler som Interrupt (Ctrl-C) og SystemExit — hvilket du normalt ikke ønsker at fange, da det kan forhindre programmet i at blive afbrudt eller lukket korrekt. En almindelig Ruby-fejl.
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
Korrekt undtagelseshåndtering er afgørende for robuste Ruby-applikationer, og forståelsen af Rubys tilgang — herunder dens specifikke idiomer og forbehold — er vigtig.
begin/rescue/ensure-strukturen (Rubys try/catch/finally), rescue af specifikke undtagelsestyper, brug af ensure til garanteret oprydning, og den rene metode-niveau rescue (uden eksplicit begin) er grundlæggende daglig viden.
Et særligt vigtigt og karakteristisk Ruby-punkt er StandardError vs Exception-skelnen: et bartsøgende rescue (og den korrekte standard) fanger StandardError, men hvis du rescuer Exception (roden i hierarkiet), fanger du alt — herunder systelsignaler som Interrupt (Ctrl-C) og SystemExit — hvilket du næsten aldrig ønsker, da det kan forhindre programmet i at blive afbrudt eller lukket korrekt, og er en almindelig, skadelig fejl.
Forståelsen af, at du skal rescue StandardError (ikke Exception) for applikationsfejl, er vigtig Ruby-specifik viden, der forhindrer rigtige fejl.
At kende strukturen, brugerdefinerede exceptionklasser (der arver fra StandardError), retry, metode-niveau rescue-idiomet, og især StandardError-not-Exception-forbeholdet er vigtigt for at skrive robust, korrekt Ruby, der håndterer fejl gracefully uden at bryde programmets evne til at blive afbrudt.
Da uhåndterede fejl og Exception-rescuing-fejlen begge forårsager rigtige problemer, er det vigtig at mestre Rubys undtagelseshåndtering — dens struktur, idiomer og den kritiske StandardError vs Exception-skelnen — vigtig, ofte relevant viden for pålidelig Ruby-udvikling og et almindeligt interviewemne.