Re: [Python-es] Saber que excepciones lanza una función

Hernan M Foffani hfoffani en gmail.com
Jue Ago 27 11:17:28 CEST 2009


2009/8/27 Chema Cortes <py en ch3m4.org>:
>>Ya por curiosidad, cuando tienes una función en la que no documentan
>>sus excepciones, ¿cómo haces para saber qué excepciones puede lanzar?
>
> Por contra de lo que afirma Hernan, sí creo que algo se puede hacer usando la
> "introspección". Si un módulo está programado como debe, las excepciones
> definidas serán subtipos de la clase Exception, por lo que se podría obtener
> un listados de excepciones con un código cómo éste:
>
> from types import ModuleType
>
> def find_exceptions(module):
>    exceptions=[]
>    for k,o in vars(module).iteritems():
>        if isinstance(o,type):
>            if isinstance(o,ModuleType):
>                exceptions.extend(find_exceptions(o))
>            elif issubclass(o,BaseException):
>                exceptions.append(k)
>    return exceptions
>
>
> Por ejemplo, para saber las excepciones del módulo "sqlite3":
>
> import sqlite3
>
> print find_exceptions(sqlite3)
>
> ---> ['Warning', 'InternalError', 'ProgrammingError', 'NotSupportedError',
> 'DataError', 'IntegrityError', 'Error', 'InterfaceError', 'DatabaseError',
> 'OperationalError']
>
>
> No puedes asegurar dónde están definidas estas excepciones, si las define el
> propio módulo o si se las apropia, pero al menos te puede dar una idea de por
> dónde va la cosa. Por poner un contraejemplo, el módulo "math" no define
> ninguna excepción de todas las que usa, por lo que de nada sirve en este caso
> la introspección.

¿Será porque se disparan desde el módulo en C?
Además tampoco puedes saber quién (método, objeto, clase) dispara esa excepción
y tampoco sabes si una excepción definida dentro del módulo "sube" hasta la API
pública.

Como decía antes en la práctica no es necesario diferenciarlas. Para
que sea útil es
decir, para que puedas tomar decisiones diferentes según cada tipo de excepción,
es necesario estén bien documentadas y como mínimo debes conocer el
funcionamiento
del módulo y el estado del mismo luego de la excepción. Esto último,
es lo mas crítico
y lo que está menos definido y explicitado y suele ser fuente de bugs
difíciles de
depurar.

Por ej, no es suficiente que una función de un módulo documente que
puede disparar
IntegrityError, TimeoutError y ConectivityError sin explicitar el
estado en que ha quedado
el objeto o la transacción (¿se puede reutilizar? ¿sigue abierta?
¿tengo que hacer un
rollback o ya fue hecho?, etc.)

En mi opinión ese es el mayor defecto de implmentar checked exceptions
dentro del
lenguaje.
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes





Más información sobre la lista de distribución Python-es