ensure y raise
Parte de la sección Lógica y flujo del Journey de Ruby de Coddy. Lección 46 de 56.
Dos elementos más completan el conjunto de herramientas para el manejo de errores.
ensure es un bloque que se ejecuta sin importar qué, ya sea que begin haya terminado normalmente, que una rama de rescue haya capturado una excepción o incluso que la excepción no haya sido capturada. Es donde colocas el código de limpieza:
begin
puts "opening file"
raise "something broke"
rescue
puts "caught it"
ensure
puts "closing file"
end
# abriendo archivo
# lo atrapé
# cerrando archivoraise es la forma de crear 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
# ... realiza el retiro
endLa convención consiste en raise pronto, al principio de un método, para fallar rápidamente cuando los argumentos son incorrectos. La persona que realiza la llamada puede usar rescue si tiene una recuperación razonable, o dejar que el error se propague.
Desafío
FácilDefine un método safe_divide(a, b) que:
- Lance
ArgumentErrorcon el mensaje"b cannot be zero"sib == 0 - De lo contrario, devuelva
a / b
Después, lee dos enteros de la entrada. Llama a safe_divide dentro de begin / rescue / ensure:
- Si tiene éxito, imprime
Result: <value> - En caso de
ArgumentError, imprimeError: <message> - En
ensure, imprime siempreDone.
Para la entrada 10 / 2, la salida es:
Result: 5
Done.Para la entrada 10 / 0:
Error: b cannot be zero
Done.Pruébalo tú mismo
# TODO: define safe_divide(a, b), lanza ArgumentError cuando b == 0
a = gets.to_i
b = gets.to_i
# TODO: begin ... print Result; rescue ArgumentError => e ... print Error; ensure ... print 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
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