Ruby maneja errores con begin// (el equivalente de Ruby a try/catch/finally). Usas para lanzar excepciones y para capturarlas, con para la limpieza. Ruby también permite rescue a nivel de método (sin un explícito) para código más limpio.
Ruby maneja errores con begin// (el equivalente de Ruby a try/catch/finally). Usas para lanzar excepciones y para capturarlas, con para la limpieza. Ruby también permite rescue a nivel de método (sin un explícito) para código más limpio.
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 es el try/catch/finally de Ruby. Captura tipos específicos de excepciones (rescue ArgumentError), usa ensure para limpieza garantizada, y else para el caso sin errores. retry puede reintentar el bloque.
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 desnudo captura StandardError (el valor por defecto correcto para errores de aplicación). Rescatar Exception (la raíz) captura todo, incluyendo señales a nivel del sistema como Interrupt (Ctrl-C) y SystemExit — que generalmente no quieres capturar, ya que puede impedir que el programa sea interrumpido o se cierre correctamente. Un error común 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
El manejo adecuado de excepciones es esencial para aplicaciones Ruby robustas, y comprender el enfoque de Ruby — incluyendo sus idiomas y advertencias específicas — es importante.
La estructura begin/rescue/ensure (el try/catch/finally de Ruby), rescatar tipos de excepciones específicas, usar ensure para limpieza garantizada, y el rescue a nivel de método limpio (sin begin explícito) son conocimientos fundamentales de uso diario.
Un punto particularmente importante y distintivo de Ruby es la distinción entre StandardError y Exception: un rescue desnudo (y el valor por defecto correcto) captura StandardError, pero rescatar Exception (la raíz de la jerarquía) captura todo — incluyendo señales del sistema como Interrupt (Ctrl-C) y SystemExit — lo que casi nunca quieres, ya que puede impedir que el programa sea interrumpido o se cierre correctamente, y es un error común y perjudicial.
Entender que debes rescatar StandardError (no Exception) para errores de aplicación es un conocimiento específico de Ruby importante que previene bugs reales.
Conocer la estructura, clases de excepciones personalizadas (heredando de StandardError), retry, el idioma de rescue a nivel de método, y especialmente la advertencia de StandardError vs Exception es importante para escribir Ruby robusto y correcto que maneje errores elegantemente sin romper la capacidad del programa de ser interrumpido.
Ya que los errores no manejados y el error de rescatar Exception causan problemas reales, dominar el manejo de excepciones de Ruby — su estructura, idiomas, y la distinción crítica entre StandardError y Exception — es importante, conocimiento frecuentemente relevante para el desarrollo confiable de Ruby y un tema común en entrevistas.