有没有办法从异常发生的上下文中打印变量范围?
例如:
def f():
a = 1
b = 2
1/0
try:
f()
except:
pass # here I want to print something like "{'a': 1, 'b': 2}"
Run Code Online (Sandbox Code Playgroud)
Syl*_*sne 15
您可以使用该函数sys.exc_info()来获取您在except子句中当前线程中发生的最后一个异常.这将是异常类型,异常实例和回溯的元组.回溯是框架的链接列表.这是解释器用于打印回溯的内容.它确实包含本地词典.
所以你可以这样做:
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
Run Code Online (Sandbox Code Playgroud)
你必须首先提取回溯,在你的例子中,这样的东西会打印它:
except:
print sys.exc_traceback.tb_next.tb_frame.f_locals
Run Code Online (Sandbox Code Playgroud)
我不确定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
Run Code Online (Sandbox Code Playgroud)