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.
Desafío
FácilLee 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 unArgumentErrorante 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!"
endCaptura el objeto de la excepción con => e para acceder a su mensaje:
begin
Integer("hello")
rescue ArgumentError => e
puts "Bad input: #{e.message}"
endUsar 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!"
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