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 abajo y ejecuta la primera cuya clase de excepción coincide.
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. Si colocas StandardError primero, capturaría todo y las ramas posteriores nunca se ejecutarían.
También puedes capturar varias clases de excepciones en una sola rama enumerándolas con comas:
begin
risky_call
rescue ArgumentError, TypeError => e
puts "Bad input: #{e.message}"
endUsa 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 y después divide la primera entre la segunda.
Maneja tres casos con ramas rescue independientes:
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!.
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
1Cadenas en profundidad
Descripción general de los métodos de cadenasInterpolación de cadenasIteración sobre cadenasSeparar y unirRepaso: Tejedor de cadenas4Bloques, Procs y Lambdas
¿Qué es un bloque?do..end frente a llavesLa palabra clave yieldParámetros de bloqueProcs y LambdasRepaso: iterador personalizado7Hashes Parte 2
Hash.new con valores predeterminadosIteración de hashesHashes anidadosCombinación y transformaciónRepaso: contador de frecuencias10Proyecto - Registros de estudiantes
Descripción general del proyectoAgregar estudiante5Potencia Enumerable
Select y RejectEncadenamiento de MapReduce / Injectcount, all?, any?, none?group_by y partitionsort_by, min_by, max_byRepaso: canalización de datos3Matrices 2D
Fundamentos de matrices 2DAcceso a elementos 2DRecorrido de matrices 2DPatrones comunes en 2DRepaso - 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 raiseRepaso: calculadora seguraPractica por tu cuenta: Compilador de Ruby online