有没有办法从异常发生的上下文打印变量范围?
例如:
def f():
a = 1
b = 2
1/0
try:
f()
except:
pass # here I want to print something like "{'a': 1, 'b': 2}"
答案 0 :(得分:14)
您可以使用函数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
答案 1 :(得分:7)
你必须首先提取回溯,在你的例子中,这样的东西会打印出来:
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
答案 2 :(得分:3)
答案 3 :(得分:0)
根据您的需求,有两种通用的最佳实践。
只需最少的代码编辑即可打印变量
看看一些相关的软件包。为了简单使用,您可以选择traceback-with-variables(pip install traceback-with-variables
),这是明信片
或者尝试tbvaccine或better-exceptions或any other package
以编程方式访问变量以在代码中使用它们
使用inspect
模块
except ... as ...:
x = inspect.trace()[-1][0].f_locals['x']