[Madrid-pm] [RFC] Gestión de errores

Joaquín Ferrero explorer en joaquinferrero.com
Vie Mar 16 02:50:48 PDT 2007


DervishD escribió:
> Hola a todos :))
> 
> La gestión de errores es algo que siempre me ha preocupado e 
> interesado, sobre todo en C y ahora ultimamente en Perl.
> 
> No pretendo iniciar una discusión sobre cuál es la mejor gestión de 
> errores en plan religioso, sino más bien oir vuestras opiniones al 
> respecto y a ver si sacamos algo en claro ;))
> 
> Hasta ahora en las cosas que he hecho tanto en C como en Perl y otros
> lenguajes, he adoptado la postura de notificar los errores en un 
> valor de retorno, bien sea de una función, bien sea de un método de
> una clase, aparte de otros mecanismos. Esto lo he hecho así porque 
> principalmente escribo bibliotecas y no programas como tales, y los 
> usuarios son vagos y las excepciones iban a cabrearles...
> 
> Dicho esto, me estoy planteando cambiar el comportamiento de las 
> funciones de mi "Common.pm", que ahora mismo notifican los errores 
> mediante el valor de retorno. De hecho, las funciones que uso para 
> notificar errores usan "exit()" y no "die()", es decir, no lanzan 
> excepciones.
> 
> Personalmente opino que las excepciones son la mejor forma de gestión
> de errores, pero en C son difíciles de implementar ya que no forman
> parte del lenguaje, y en Perl el "haz_esto or die" está muy 
> arraigado. Además, en Perl la gestión de excepciones con eval no es
> mi preferida, pero bueno, eso dejémoslo estar.
> 
> Lo que quería comentar con vosotros es lo siguiente: ¿preferís 
> notificar los errores a través de un valor de retorno o de una 
> excepción? Y si preferís esto último: ¿estilo tradicional, con texto
> en $@, o mejor usando una referencia y pasando así información
> extendida y estructurada al llamante? Esto último es lo que más me
> interesa, porque aunque por ahí leáis que hay que construir una clase
> para usar este tipo de excepciones, llamando a "die" con una
> referencia "blessed", no es verdad, esa referencia no tiene por qué
> estar "blessed".
> 
> ¿Qué opinais al respecto?
> 
> Mi opinión es que me encantaría poder combinar ambas cosas, y hasta 
> cierto punto se puede hacer, usando "wantarray" y lanzando
> excepciones siempre que la función se esté llamando en "void
> context", pero si uso excepciones (en realidad mi preferida) prefiero
> usar siempre referencias para poder estructurar la información que
> devuelve el error. Lo que no tengo claro es si usaría una clase para
> ello o una simple referéncia anónima a un hash.
> 
> Gracias por vuestros comentarios :)
> 
> Raúl Núñez de Arenas Coronado
> 

Recomendado leer el capítulo 13 de "Perl Best Practices".

13.1. Exceptions
Throw exceptions instead of returning special values or setting flags.

13.2. Builtin Failures
Make failed builtins throw exceptions too.

13.3. Contextual Failure
Make failures fatal in all contexts.

13.4. Systemic Failure
Be careful when testing for failure of the system builtin.

13.5. Recoverable Failure
Throw exceptions on all failures, including recoverable ones.

13.6. Reporting Failure
Have exceptions report from the caller's location, not from the place 
where they were thrown.

13.7. Error Messages
Compose error messages in the recipient's dialect.

13.8. Documenting Errors
Document every error message in the recipient's dialect.

13.9. OO Exceptions
Use exception objects whenever failure data needs to be conveyed to a 
handler.

13.10. Volatile Error Messages
Use exception objects when error messages may change.

13.11. Exception Hierarchies
Use exception objects when two or more exceptions are related.

13.12. Processing Exceptions
Catch exception objects in most-derived-first order.

13.13. Exception Classes
Build exception classes automatically.

13.14. Unpacking Exceptions
Unpack the exception variable in extended exception handlers.

Decidido... me lo voy a comprar...

-- 
explorer en joaquinferrero.com


Más información sobre la lista de distribución Madrid-pm