Commited!

Rails 2.0 está no muy lejos y nosotros vamos jugando ya con la pre-release o directamente Rails Edge. De hecho la conferencia de Javi en la Conferencia Rails Hispana sobre plugins incorporará novedades de la 2.0 sobre el tema, y la mía explicará las cosas sobre el código último. Tanto es así que los snippets de código de las slides se extraen en runtime de trunk.

Una de las funcionalidades nuevas que quise aplicar ipso facto fue rescue_from. La idea es que en un controlador puedes declarar handlers para excepciones:

rescue_from SomeException, :with => :some_action

De manera que si salta SomeException en una acción Rails llama al handler some_action.

Magnífico! Estamos desarrollando un web service RESTful donde esto viene de perlas, ya que en varios puntos del servicio se pueden lanzar excepciones acordadas para indicar errores y nos viene fenómeno poder manejarlas en un punto único. De saltar, lo que hay que hacer es responder al cliente con códigos 4xx o 5xx, según el caso.

Así que ahí estamos reescribiendo esa parte de la aplicación cuando me doy cuenta de que no funciona como esperaba: no se tenía en cuenta herencia de excepciones, y otros gotchas. Se registraba el nombre de la excepción en una tabla hash y luego se hacía un lookup por nombre. Útil, pero algo limitado.

Nosotros en esta aplicación tenemos una jerarquía de excepciones para tratar de ser específicos al reportar un problema, y lo interesante sería registrar un handler para la raíz de la jerarquía (cosa que emulábamos a mano con un rescue_action global al estilo pre-2.0). De otro modo habría que declarar un rescue_from por cada una de las excepciones, camino que tarde o temprano te conduce a un par de gelocatiles.

El rescue de Ruby se comporta de ese modo, de ahí que uno esperaría un comportamiento similar emulado. Además, sería deseable también poder expresar prioridades entre handlers y herencia de handlers.

Al core team le pareció en principio bien el planteamiento y sugirió alguna funcionalidad adicional, así que le hemos echado un par de cafés al tema y hemos enviado un parche que ya está en trunk.

Adelante!

Deje un comentario