gpt4 book ai didi

python - traceback.print_exc() 显示不完整的堆栈跟踪

转载 作者:太空宇宙 更新时间:2023-11-04 02:56:05 27 4
gpt4 key购买 nike

traceback 模块非常适合捕获和处理异常,但在下面的示例中,它似乎从最近的异常中捕获了一个不完整的堆栈。

考虑两个文件,一个是“mymod.py”:

import sys, traceback

def func():
try:
otherfunc()
except:
raise
#traceback.print_exc()

def otherfunc():
raise Exception( 'fake' )

另一个说“myfile.py”:

from mymod import *
func()

运行 myfile.py 得到:

Traceback (most recent call last):
File "myfile.py", line 2, in <module>
func()
File "/Users/rrdrake/temp/mymod.py", line 5, in func
otherfunc()
File "/Users/rrdrake/temp/mymod.py", line 11, in otherfunc
raise Exception( 'fake' )

现在更改 mymod.py 以注释掉“raise”并取消注释 print_exc 行。然后我们得到

Traceback (most recent call last):
File "/Users/rrdrake/temp/mymod.py", line 5, in func
otherfunc()
File "/Users/rrdrake/temp/mymod.py", line 11, in otherfunc
raise Exception( 'fake' )
Exception: fake

请注意 print_exc() 不包含 myfile.py 框架,而 re-raising 包含。如何让 print_exc() 包含原始调用帧?

请注意,如果我在 except block 中添加 traceback.print_stack(),它确实包含 myfile.py 框架,因此信息似乎可用。

最佳答案

在您的第一种情况下,您的 raise 调用的异常会在脚本的顶层冒泡。 Python 调用 sys.excepthook(),它显示完整的回溯。

在你的第二种情况下,异常被捕获并且 print_exc() 被用来打印异常,这在你的调用函数处停止(otherfunc() case) 所以你得不到完整的回溯。

您可以使用自己的回溯/异常打印功能来更改它,沿着这些方向的东西:

def print_full_stack(tb=None):
if tb is None:
tb = sys.exc_info()[2]

print 'Traceback (most recent call last):'
for item in reversed(inspect.getouterframes(tb.tb_frame)[1:]):
print ' File "{1}", line {2}, in {3}\n'.format(*item),
for line in item[4]:
print ' ' + line.lstrip(),
for item in inspect.getinnerframes(tb):
print ' File "{1}", line {2}, in {3}\n'.format(*item),
for line in item[4]:
print ' ' + line.lstrip(),

只需将 traceback.print_exc() 替换为 print_full_stack()。该函数涉及inspect模块获取代码帧。

您可以阅读此博客以获取更多信息:http://blog.dscpl.com.au/2015/03/generating-full-stack-traces-for.html

注意,上面文章中的代码有一些缩进错误...

关于python - traceback.print_exc() 显示不完整的堆栈跟踪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42328723/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com