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

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

Например:

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

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

Ответ 1

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

Итак, вы можете сделать:

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

Ответ 2

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

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

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

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