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."
endEl 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}"
endUtilice esto cuando el código de recuperación sea el mismo para varios modos de fallo.
Desafío
FácilLee 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→ imprimeBad number!ZeroDivisionError→ imprimeCannot divide by zero!TypeError→ imprimeWrong 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."
endEnumera 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
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
1Strings en profundidad
Visión general de los métodos de StringInterpolación de StringsIterar sobre StringsSplit y JoinRepaso - String Weaver4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end vs llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasResumen - Iterador personalizado7Hashes Parte 2
Hash.new con valores por defectoIteración de HashesHashes anidadosFusión y transformaciónResumen - Contador de frecuencia10Proyecto - Registros de Estudiantes
Descripción general del proyectoAgregar estudiante5Potencia de Enumerable
Select y RejectEncadenando MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byResumen - Data Pipeline3Arreglos 2D
Conceptos básicos de arreglos 2DAcceso a elementos 2DIteración sobre arreglos 2DPatrones comunes en 2DResumen - Operaciones con matrices6Proyecto - Gestor de biblioteca
Descripción general del proyectoAñadir libro9Manejo de errores
¿Qué es una excepción?begin / rescueMúltiples cláusulas rescueensure y raiseResumen - Calculadora segura