Menu
Coddy logo textTech

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 archivo

raise 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
end

La 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.

challenge icon

Desafío

Fácil

Define un método safe_divide(a, b) que:

  • Lance ArgumentError con el mensaje "b cannot be zero" si b == 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, imprime Error: <message>
  • En ensure, imprime siempre Done.

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.
quiz iconPonte a prueba

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

Practica por tu cuenta: Compilador de Ruby online