打印活动 TRY 块的列表(或树)

问题描述 投票:0回答:1

我正在调试一些复杂的遗留 Python3 代码,发现自己需要知道在执行代码中的特定点,调用堆栈中处于活动状态的所有

try
块。 有没有办法内省并打印出嵌套树?

例如,我们可能有这样的代码:

def fn1():
    try:
        fn2()
    except IOError:
        # do something

def fn2():
    try:
        fn3()
    except NameError:
        # do something

def fn3():
    print( **YourAnswerHere** )

这个想法是,如果我调用

fn1()
那么
fn3
中的打印语句将产生类似以下内容:

    fn1: try / except IOError
        fn2: try / except NameError

如果这是不可能的,如果它只是打印

[fn1 fn2]
我就能相处。 理想情况下它也能处理
try / finally
块。

我用谷歌找不到任何相关信息。 我查看了 Python 的

try
inspect
模块文档中出现的所有
traceback
一词,但没有发现任何结果。
ast
模块具有与
try
相关的类,但我不知道如何使用它们,看起来这些类是用于分析静态代码,而不是执行代码。 谢谢。

python try-except traceback
1个回答
0
投票

您可以使用

inspect
dis
模块进行检查:

import inspect, dis


def _active():
    res = []
    for f in inspect.stack()[1:]:
        res.extend(_blocks(f.frame.f_code))
    return res


def _blocks(code):
    res = []
    for i in dis.get_instructions(code):
        if i.opcode == dis.opmap['SETUP_EXCEPT']:
            res.append((code.co_name, "try"))
        elif i.opcode == dis.opmap['SETUP_FINALLY']:
            res.append((code.co_name, "finally"))
    return res


def fn1():
    try:
        fn2()
    except IOError:
        pass
    finally:
        return "fn1 Done"


def fn2():
    try:
        fn3()
    except NameError:
        pass
    finally:
        return "fn2 Done"


def fn3():
    print(_active())


fn1()


打印

[('fn2', 'finally'), ('fn2', 'try'), ('fn1', 'finally'), ('fn1', 'try')]

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.