Ruby behandelt Fehler mit begin/rescue/ (Rubys Äquivalent zu try/catch/finally). Sie Exceptions und sie, wobei für Cleanup verwendet wird. Ruby erlaubt auch Methoden-Level-Rescue (ohne explizites ) für sauberen Code.
Ruby behandelt Fehler mit begin/rescue/ (Rubys Äquivalent zu try/catch/finally). Sie Exceptions und sie, wobei für Cleanup verwendet wird. Ruby erlaubt auch Methoden-Level-Rescue (ohne explizites ) für sauberen Code.
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 ist Rubys try/catch/finally. Retten Sie bestimmte Typen (rescue ArgumentError), verwenden Sie ensure für garantierte Bereinigung, und else für den Fall ohne Fehler. retry kann den Block erneut versuchen.
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
Wichtig: Ein einfaches rescue fängt StandardError (die korrekte Standardeinstellung für Anwendungsfehler). Wenn Sie Exception (die Root-Klasse) retten, fangen Sie alles, einschließlich System-Level-Signalen wie Interrupt (Ctrl-C) und SystemExit — die Sie normalerweise nicht fangen möchten, da dies verhindern kann, dass das Programm unterbrochen oder korrekt beendet wird. Ein häufiger Ruby-Fehler.
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
Ordnungsgemäße Fehlerbehandlung ist für robuste Ruby-Anwendungen unerlässlich, und das Verständnis von Rubys Ansatz — einschließlich seiner spezifischen Idiome und Einschränkungen — ist wichtig.
Die begin/rescue/ensure-Struktur (Rubys try/catch/finally), das Retten von bestimmten Exception-Typen, die Verwendung von ensure für garantierte Bereinigung und das saubere Methoden-Level-Rescue (ohne explizites begin) sind fundamentales alltägliches Wissen.
Ein besonders wichtiger und ausdrücklich Ruby-spezifischer Punkt ist die StandardError- vs Exception-Unterscheidung: Ein einfaches rescue (und die korrekte Standardeinstellung) fängt StandardError, aber das Retten von Exception (die Root-Klasse der Hierarchie) fängt alles — einschließlich System-Signalen wie Interrupt (Ctrl-C) und SystemExit — die Sie fast nie fangen möchten, da dies verhindern kann, dass das Programm unterbrochen oder ordnungsgemäß beendet wird, und dies ist ein häufiger, schädlicher Fehler.
Das Verständnis, dass Sie StandardError (nicht Exception) für Anwendungsfehler retten sollten, ist wichtiges Ruby-spezifisches Wissen, das echte Fehler verhindert.
Die Struktur zu kennen, benutzerdefinierte Exception-Klassen (die von StandardError erben), retry, das Methoden-Level-Rescue-Idiom und besonders die StandardError-nicht-Exception-Einschränkung ist wichtig, um robuste, korrekte Ruby zu schreiben, die Fehler elegant behandelt, ohne die Fähigkeit des Programms zur Unterbrechung zu beeinträchtigen.
Da unbehandelte Fehler und der Exception-Rescue-Fehler beide echte Probleme verursachen, ist die Beherrschung von Rubys Fehlerbehandlung — ihre Struktur, Idiome und die kritische StandardError-vs-Exception-Unterscheidung — wichtiges, häufig relevantes Wissen für zuverlässige Ruby-Entwicklung und ein häufiges Interview-Thema.