2012-01-25 9 views
9

Un patrón común en python es detectar un error en un módulo en sentido ascendente y volver a generar ese error como algo más útil.¿Hay alguna forma de acceder a las excepciones anidadas o reencaminadas en python?

try: 
    config_file = open('config.ini', 'r') 
except IOError: 
    raise ConfigError('Give me my config, user!') 

Esto generará un seguimiento de la pila de la forma

Traceback (most recent call last): 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

¿Hay alguna manera de acceder a la excepción ajustada con el fin de generar un seguimiento de pila de la misma familia?

Traceback (most recent call last): 
    File "<stdin>", line 2, in <module> 
__builtin__.IOError: File Does not exist. 
Exception wrapped by: 
    File "<stdin>", line 4, in <module> 
__main__.ConfigError: Give me my config, user! 

EDIT:

El problema que estoy tratando de derrota es que algún código de tercera parte puede envolver excepciones hasta 3 veces y quiero ser capaz de determinar la causa raíz, es decir, una forma genérica para inspeccionar la pila de excepciones y determinar la causa raíz de una excepción sin tener que agregar ningún código adicional a los módulos de terceros.

+0

¿ayuda sys.last_traceback en absoluto? –

+0

también puede consultar el [módulo de rastreo de python] (http://docs.python.org/library/traceback.html?highlight=traceback) –

+0

Disculpe, esta es una de esas preguntas molestas, pero ... ¿por qué? – senderle

Respuesta

11

Esto se conoce como Excepción encadenamiento y se suported en Python 3.

PEP 3134: http://www.python.org/dev/peps/pep-3134/

En Python 2, el viejo excepción se pierde cuando se levanta una nueva, a menos que guarde en el bloque except.

+0

¡Muy bueno! Gracias por compartir –

+2

¿Qué quiere decir con "guardarlo en el bloque excepto"? ¿Hay una forma estándar para hacer eso? –

5

Utilice traceback . Le permitirá acceder al rastreo más reciente y almacenarlo en una cadena. Por ejemplo,

import traceback 
try: 
    config_file = open('config.ini', 'r') 
except OSError: 
    tb = traceback.format_exc() 
    raise ConfigError('Give me my config, user!',tb) 

El rastreo "anidada" se almacenará en la tuberculosis y pasó a ConfigError, donde se puede trabajar con él lo que le apetezca.

+0

Además, el resultado de format_exc() (que se almacena en tb) es solo una cadena, que consiste en de exactamente el mismo texto que se imprimiría si no estuviera en un bloque try/except. – austin1howard

+0

Para responder a su edición, hasta donde yo sé, la función format_exc arrojará toda la información disponible en la trazabilidad. Si un módulo de un tercero "suprime" cierta información en un ciclo try/except, no podrá recuperarlo sin modificar ese bucle try/except * particular *. – austin1howard

Cuestiones relacionadas