Re: [Python-es] Saber que excepciones lanza una func ión
Hernan M Foffani <[email protected]>
| Newsgroups | gmane.comp.python.general.castellano |
|---|---|
| Message-ID | <[email protected]> |
2009/8/27 Chema Cortes <[email protected]>: >>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