我正在调试一些复杂的遗留 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
相关的类,但我不知道如何使用它们,看起来这些类是用于分析静态代码,而不是执行代码。 谢谢。
您可以使用
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')]