Я работаю над полезными помощниками по самоанализу исключения, поэтому хотел обобщать код, а не копировать его все время. У меня есть
def state_on_exc(f):
@wraps(f)
def wrapper(*args, **kwargs):
try:
result = f(*args, **kwargs)
return result
except Exception as e:
ex_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)
raise e
@state_on_exc
def apply(f):
return f
def myfunc():
a = 5
raise ValueError
apply(myfunc())
Но оболочка, похоже, не вызывается при исключении (она была специально поднята в myfunc()
) - она не печатает никаких локальных переменных. Есть ли какой-то правильный способ добиться того же или лучший способ сделать это?