2011-03-16 18 views
10

¿Hay alguna manera de imprimir el ámbito de variables desde el contexto donde ocurre la excepción?Para Python, ¿hay alguna manera de imprimir el alcance de las variables desde el contexto donde ocurre la excepción?

Por ejemplo:

def f(): 
    a = 1 
    b = 2 
    1/0 

try: 
    f() 
except: 
    pass # here I want to print something like "{'a': 1, 'b': 2}" 
+0

¿Qué significa "para imprimir las variables de alcance" significa? ¿Podría dar un ejemplo? –

+1

Para eso es la cláusula 'except'. Proporcione algún código para ilustrar por qué no está imprimiendo cosas en la cláusula 'except'. –

+0

Quiero imprimir todas las variables en el alcance de la excepción. – Soid

Respuesta

14

puede utilizar la función sys.exc_info() para obtener la última excepción que se produjo en el hilo actual en que, salvo cláusula. Esta será una tupla de tipo de excepción, instancia de excepción y rastreo. El rastreo es una lista vinculada de marco. Esto es lo que se usa para imprimir la traza inversa por parte del intérprete. Sí contiene el dictionario local.

lo que puede hacer:

import sys 

def f(): 
    a = 1 
    b = 2 
    1/0 

try: 
    f() 
except: 
    exc_type, exc_value, tb = sys.exc_info() 
    if tb is not None: 
     prev = tb 
     curr = tb.tb_next 
     while curr is not None: 
      prev = curr 
      curr = curr.tb_next 
     print prev.tb_frame.f_locals 
3

Tal vez usted está buscando locals() y globals()?

+0

Lo vi antes de mi pregunta pero no puede obtener variables de contexto de excepción. No sé cómo usarlo en el ejemplo anterior. – Soid

+0

Sí, tienes razón. En su código de ejemplo, no podría obtener el contexto de la función 'f' utilizando estas funciones. –

7

Tienes que primero rastreo extracto, en su ejemplo algo como esto sería imprimirlo:

except: 
    print sys.exc_traceback.tb_next.tb_frame.f_locals 

No estoy seguro sobre el tb_next, yo supongo que tienes que ir a través de la traza completa, por lo algo como esto (no probado):

except: 
    tb_last = sys.exc_traceback 
    while tb_last.tb_next: 
     tb_last = tb_last.tb_next 
    print tb_last.tb_frame.f_locals 
Cuestiones relacionadas