+54 911 66509220

Blog

Blog
9 Mar 2015

Tutorial de Ruby – Parte 28 – Procesamiento de excepciones: ensure

/
Creado por
/
Comentarios0

Cuando un método termina su ejecución puede que se necesiten ciertas labores de limpieza. Quizás se tenga que cerrar un fichero abierto, se deban liberar los datos de los buffers, etc. Si siempre hubiese un único punto de salida para cada método, se podría poner con seguridad todo el código de limpieza en un lugar concreto y saber que se ejecutará, sin embargo, un método podría retornar en varios lugares o el código de limpieza podría saltarse inesperadamente debido a una excepción.

 

begin

file = open(“/tmp/algun_fichero”,”w”)

# … Escribimos en el fichero …

file.close

end

 

En el ejemplo superior, si ocurre una excepción durante la parte del código en que se escribe en el fichero, éste quedará abierto. Si no deseamos recurrir al siguiente tipo de redundancia:

 

begin

file = open(“/tmp/algun_fichero”,”w”)

# … Escribimos en el fichero …

file.close

rescue

file.close

fail # levantamos una excepción

end

 

Que es desgarbada y se nos escapa de las manos cuando el código se vuelve más complicado debido a que hay que tratar todo return y break.

 

Por esta razón se añadió otra palabra reservada a esquema begin … rescue … end, ensure. El bloque de código de ensure se ejecuta independientemente del éxito o fracaso del bloque de código en begin.

 

begin

file = open(“/tmp/algun_fichero”,”w”)

# … Escribimos en el fichero …

rescue

# … gestionamos las excepciones …

ensure

file.close # … Y esto se ejecuta siempre.

end

 

Se puede utilizar ensure sin rescue y viceversa, pero si se utilizan en el mismo bloque begin … end, rescue debe preceder a ensure.

 

Leave a Reply

Your email address will not be published.

* Copy This Password *

* Type Or Paste Password Here *

23,021 Spam Comments Blocked so far by Spam Free Wordpress

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

This site uses Akismet to reduce spam. Learn how your comment data is processed.