对于python有没有办法从异常发生的上下文打印变量范围?

时间:2011-03-16 15:52:35

标签: python exception

有没有办法从异常发生的上下文打印变量范围?

例如:

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

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

4 个答案:

答案 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)

也许您正在寻找locals()globals()

答案 3 :(得分:0)

根据您的需求,有两种通用的最佳实践。

只需最少的代码编辑即可打印变量

看看一些相关的软件包。为了简单使用,您可以选择traceback-with-variablespip install traceback-with-variables),这是明信片

enter image description here

或者尝试tbvaccinebetter-exceptionsany other package

以编程方式访问变量以在代码中使用它们

使用inspect模块

except ... as ...:
    x = inspect.trace()[-1][0].f_locals['x']