Menu
Coddy logo textTech

begin / rescue

Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 44 de 56.

Para evitar que una excepción detenga la ejecución de su programa, envuelva el código de riesgo en begin ... rescue ... end. Si algo dentro de begin lanza una excepción, Ruby salta al bloque rescue correspondiente en lugar de abortar.

begin
  result = 10 / 0
  puts result
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end
# Cannot divide by zero!

Puedes capturar el objeto de la excepción con => e y leer su .message:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end
# Bad input: invalid value for Integer(): "hello"

Si no nombras una clase de excepción, rescue por sí solo captura StandardError y sus descendientes, la mayoría de los fallos cotidianos. Capturar es más útil cuando puedes hacer algo en el bloque rescue: sustituir un valor por defecto, registrar el problema, preguntar al usuario de nuevo.

challenge icon

Desafío

Fácil

Lee dos líneas de la entrada, ambas deberían ser enteros, pero la segunda podría no ser un número válido.

Envuelve el procesamiento de la segunda línea en un bloque begin / rescue:

  • Usa Integer(input) (que lanza un ArgumentError ante una cadena no válida)
  • Si el procesamiento tiene éxito, imprime Sum: <a + b>
  • Si falla, imprime Bad number!

Para la entrada 3 y luego 4, la salida es Sum: 7. Para 3 y luego abc, es Bad number!.

Hoja de referencia

Usa begin ... rescue ... end para manejar excepciones sin que el programa falle:

begin
  result = 10 / 0
rescue ZeroDivisionError
  puts "Cannot divide by zero!"
end

Captura el objeto de la excepción con => e para acceder a su mensaje:

begin
  Integer("hello")
rescue ArgumentError => e
  puts "Bad input: #{e.message}"
end

Usar rescue sin una clase captura StandardError y sus descendientes.

Pruébalo tú mismo

a = gets.to_i
raw_b = gets.chomp

# TODO: begin/rescue alrededor de Integer(raw_b); imprimir la suma o "Bad number!"
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Lógica y flujo