Для python есть способ вывести область видимости переменных из контекста, где происходит исключение? - PullRequest
11 голосов
/ 16 марта 2011

Есть ли способ вывести область видимости переменных из контекста, где происходит исключение?

Например:

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

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

Ответы [ 3 ]

15 голосов
/ 16 марта 2011

Вы можете использовать функцию sys.exc_info(), чтобы получить последнее исключение, которое произошло в текущем потоке в вас, кроме предложения. Это будет кортеж типа исключения, экземпляра исключения и трассировки. Трассировка - это связанный список фреймов. Это то, что используется для печати обратного следа интерпретатором. Содержит местный словарь.

Так что вы можете сделать:

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
7 голосов
/ 16 марта 2011

Вы должны сначала извлечь трассировку, в вашем примере что-то вроде этого напечатало бы:

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

Я не уверен насчет tb_next, я полагаю, вам нужно пройти полный возврат, так что-то вроде этого (не проверено):

except:
    tb_last = sys.exc_traceback
    while tb_last.tb_next:
        tb_last = tb_last.tb_next
    print tb_last.tb_frame.f_locals
3 голосов
/ 16 марта 2011

Возможно, вы ищете localals () и globals () ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...