traceback.print_exc()显示不完整的s

2024-09-30 01:27:21 发布

您现在位置:Python中文网/ 问答频道 /正文

回溯模块对于捕获和处理异常非常有用,但是在下面的示例中,它似乎从最近的异常捕获了一个不完整的堆栈。在

考虑两个文件,一个说“mymod.py公司“:

import sys, traceback

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

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

另一个说我的文件.py“:

^{pr2}$

跑步我的文件.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\u 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()不包括文件.mypy重新升高时的框架。如何使print_exc()包含源调用帧?在

请注意,如果我添加traceback.print_堆栈()在except块中,它确实包含我的文件.py帧,所以信息似乎是可用的。在


Tags: 文件inpylineexceptionusersfakefile
1条回答
网友
1楼 · 发布于 2024-09-30 01:27:21

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

在第二种情况下,捕捉异常并使用print_exc()打印异常,这将在调用函数(在您的示例中为otherfunc())处停止,因此您不会得到完整的回溯。在

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

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

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

相关问题 更多 >

    热门问题