Ruby gère les erreurs avec begin// (l'équivalent Ruby de try/catch/finally). Vous des exceptions et les , avec pour le nettoyage. Ruby permet également une rescue au niveau de la méthode (sans explicite) pour un code plus propre.
Ruby gère les erreurs avec begin// (l'équivalent Ruby de try/catch/finally). Vous des exceptions et les , avec pour le nettoyage. Ruby permet également une rescue au niveau de la méthode (sans explicite) pour un code plus propre.
rescueensureraiserescueensurebeginbegin
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 est le try/catch/finally de Ruby. Rescuer des types spécifiques (rescue ArgumentError), utiliser ensure pour un nettoyage garanti, et else pour le cas sans erreur. retry peut rétenter le bloc.
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
Important : un rescue nu capture StandardError (la valeur par défaut correcte pour les erreurs d'application). Rescuer Exception (la racine) capture tout, y compris les signaux au niveau du système comme Interrupt (Ctrl-C) et SystemExit — ce que vous ne voulez généralement pas capturer, car cela peut empêcher le programme d'être interrompu ou fermé correctement. C'est une erreur courante en 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
Une gestion appropriée des exceptions est essentielle pour des applications Ruby robustes, et comprendre l'approche de Ruby — y compris ses idiomes et mises en garde spécifiques — est importante.
La structure begin/rescue/ensure (le try/catch/finally de Ruby), rescuer des types d'exceptions spécifiques, utiliser ensure pour un nettoyage garanti, et le rescue au niveau de la méthode propre (sans begin explicite) sont des connaissances fondamentales du quotidien.
Un point particulièrement important et distinctement Ruby est la distinction StandardError vs Exception : un rescue nu (et la valeur par défaut correcte) capture StandardError, mais rescuer Exception (la racine de la hiérarchie) capture tout — y compris les signaux système comme Interrupt (Ctrl-C) et SystemExit — ce que vous ne voulez presque jamais, car cela peut empêcher le programme d'être interrompu ou fermé correctement, et c'est une erreur courante et nuisible.
Comprendre que vous devriez rescuer StandardError (pas Exception) pour les erreurs d'application est une connaissance spécifique à Ruby importante qui prévient les vrais bugs.
Connaître la structure, les classes d'exceptions personnalisées (héritant de StandardError), retry, l'idiome rescue au niveau de la méthode, et surtout la mise en garde StandardError-not-Exception est important pour écrire du Ruby robuste et correct qui gère les erreurs avec grâce sans briser la capacité du programme à être interrompu.
Puisque les erreurs non gérées et l'erreur de rescuer Exception causent tous deux de vrais problèmes, maîtriser la gestion des exceptions en Ruby — sa structure, ses idiomes, et la distinction critique StandardError vs Exception — est une connaissance importante et fréquemment pertinente pour un développement Ruby fiable et un sujet d'entretien courant.