Menu
Coddy logo textTech

Múltiples cláusulas rescue

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

Un bloque begin puede tener varias cláusulas rescue. Ruby las comprueba de arriba a abajo y ejecuta la primera cuya clase de excepción coincida.

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

El orden importa: enumera las clases específicas antes que las generales. StandardError colocada primero lo absorbería todo y las ramas posteriores nunca se ejecutarían.

También puedes capturar múltiples clases de excepción en una sola rama enumerándolas con comas:

begin
  risky_call
rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"
end

Utilice esto cuando el código de recuperación sea el mismo para varios modos de fallo.

challenge icon

Desafío

Fácil

Lee dos líneas de la entrada, ambas destinadas a ser enteros. Usa Integer(...) para ambas, luego divide la primera por la segunda.

Maneja tres casos con ramas rescue separadas:

  • ArgumentError → imprime Bad number!
  • ZeroDivisionError → imprime Cannot divide by zero!
  • TypeError → imprime Wrong type!

Si todo funciona, imprime Result: <a / b> (división entera).

Para la entrada 10 / 2, la salida es Result: 5. Para 10 / 0, Cannot divide by zero!. Para 10 / abc, Bad number!.

Hoja de referencia

Un bloque begin puede tener múltiples cláusulas rescue — Ruby las compara de arriba hacia abajo:

begin
  number = Integer(gets.chomp)
  result = 100 / number
  puts result
rescue ArgumentError
  puts "That's not a valid number."
rescue ZeroDivisionError
  puts "Can't divide by zero."
end

Enumera las clases de excepción específicas antes que las generales — una clase general como StandardError colocada primero absorbería todas las ramas posteriores.

Captura múltiples clases de excepción en una sola rama separándolas con comas:

rescue ArgumentError, TypeError => e
  puts "Bad input: #{e.message}"

Pruébalo tú mismo

raw_a = gets.chomp
raw_b = gets.chomp

# TODO: begin ... rescue ArgumentError ... rescue ZeroDivisionError ... rescue TypeError ... end
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