Ruby gestisce gli errori con (equivalente di try/catch/finally). Si lancia un'eccezione con e la si intercetta con , mentre è dedicato alla pulizia del codice. Ruby consente anche il a livello di metodo (senza esplicito) per un codice più pulito.
Ruby gestisce gli errori con (equivalente di try/catch/finally). Si lancia un'eccezione con e la si intercetta con , mentre è dedicato alla pulizia del codice. Ruby consente anche il a livello di metodo (senza esplicito) per un codice più pulito.
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 è il try/catch/finally di Ruby. Intercetta i tipi specifici di eccezione (rescue ArgumentError), usa ensure per la pulizia garantita, e else nel caso non si verifichino errori. retry può riprovare il blocco.
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
Importante: un rescue vuoto intercetta StandardError (il valore predefinito corretto per gli errori applicativi). Intercettare Exception (la radice) cattura tutto, inclusi i segnali a livello di sistema come Interrupt (Ctrl-C) e SystemExit — che di solito non vuoi catturare, poiché può impedire al programma di essere interrotto o chiuso correttamente. È un errore comune in 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
La gestione corretta delle eccezioni è essenziale per applicazioni Ruby robuste, e la comprensione dell'approccio di Ruby — inclusi i suoi idiomi e le sue caveat specifiche — è importante.
La struttura begin/rescue/ensure (il try/catch/finally di Ruby), l'intercettazione di tipi di eccezione specifici, l'uso di ensure per la pulizia garantita, e il rescue a livello di metodo pulito (senza begin esplicito) sono conoscenze fondamentali quotidiane.
Un punto particolarmente importante e distintamente di Ruby è la distinzione tra StandardError e Exception: un rescue vuoto (e il valore predefinito corretto) intercetta StandardError, ma intercettare Exception (la radice della gerarchia) cattura tutto — inclusi i segnali di sistema come Interrupt (Ctrl-C) e SystemExit — cosa che quasi mai vuoi fare, poiché può impedire al programma di essere interrotto o chiuso correttamente, ed è un errore comune e dannoso.
Capire che dovresti intercettare StandardError (non Exception) per gli errori applicativi è una conoscenza specifica di Ruby importante che previene veri bug.
Conoscere la struttura, le classi di eccezione personalizzate (che ereditano da StandardError), retry, l'idioma del rescue a livello di metodo, e soprattutto la caveat StandardError-non-Exception è importante per scrivere Ruby robusto e corretto che gestisce gli errori in modo elegante senza compromettere la capacità del programma di essere interrotto.
Poiché gli errori non gestiti e l'errore di intercettare Exception causano entrambi problemi reali, padroneggiare la gestione delle eccezioni di Ruby — la sua struttura, i suoi idiomi, e la distinzione critica tra StandardError e Exception — è una conoscenza importante e frequentemente rilevante per uno sviluppo Ruby affidabile e un argomento comune nei colloqui.