ensure y raise
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy — lección 46 de 56.
Dos piezas más completan el kit de herramientas para el manejo de errores.
ensure es un bloque que se ejecuta pase lo que pase, ya sea que begin haya terminado normalmente, o que una rama rescue haya capturado una excepción, o incluso si la excepción no fue capturada. Es donde se coloca el código de limpieza:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# abriendo archivo
# capturado
# cerrando archivoraise es como creas tu propia excepción. Pasa una cadena para el mensaje, o una clase más un mensaje:
def withdraw(amount)
raise ArgumentError, "amount must be positive" if amount <= 0
# ... realizar el retiro
endLa convención es usar raise temprano, al principio de un método, para fallar rápido cuando los argumentos son incorrectos. El llamador puede usar rescue si tiene una recuperación sensata, o dejar que se propague.
Desafío
FácilDefine un método safe_divide(a, b) que:
- Lanza
ArgumentErrorcon el mensaje"b cannot be zero"sib == 0 - De lo contrario, devuelve
a / b
Luego lee dos enteros de la entrada. Llama a safe_divide dentro de begin / rescue / ensure:
- En caso de éxito, imprime
Result: <value> - En caso de
ArgumentError, imprimeError: <message> - En
ensure, siempre imprimeDone.
Para la entrada 10 / 2, la salida es:
Result: 5
Done.Para la entrada 10 / 0:
Error: b cannot be zero
Done.Hoja de referencia
ensure se ejecuta pase lo que pase (salida normal, rescatada o excepción no capturada); úsalo para la limpieza:
begin
raise "something broke"
rescue
puts "caught it"
ensure
puts "always runs"
endraise crea una excepción. Pasa una clase y un mensaje para lanzar un tipo específico:
raise ArgumentError, "amount must be positive" if amount <= 0Convención: usa raise temprano al principio de un método para fallar rápido ante argumentos incorrectos.
Pruébalo tú mismo
# TODO: definir safe_divide(a, b), lanza ArgumentError cuando b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... imprimir Result; rescue ArgumentError => e ... imprimir Error; ensure ... imprimir Done.
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