traceback —打印或检索堆栈回溯

源代码: Lib/traceback.py


该模块提供了一个标准接口,用于提取,格式化和打印 Python 程序的堆栈跟踪。它精确地模仿了 Python 解释器在打印堆栈跟踪时的行为。当您想在程序控制下打印堆栈跟踪时,例如在解释器周围的“包装器”中,这很有用。

该模块使用回溯对象-这是存储在sys.last_traceback变量中并作为第二项从sys.exc_info()返回的对象类型。

该模块定义了以下Function:

在版本 3.5 中更改:添加了负* limit *支持。

可选的* limit 参数与print_tb()的含义相同。如果 chain *为 true(默认设置),则也将打印链式异常(异常的__cause____context__属性),就像解释器本身在打印未处理的异常时所做的一样。

在版本 3.5 中进行了更改:* etype 参数被忽略,并从 value *的类型推断出。

在版本 3.5 中更改:添加了负* limit *支持。

在版本 3.5 中进行了更改:* etype 参数被忽略,并从 value *的类型推断出。

3.4 版的新Function。

3.5 版中的新Function。

3.5 版中的新Function。

该模块还定义了以下类:

TracebackException Objects

3.5 版中的新Function。

TracebackException对象是根据实际异常创建的,以捕获数据,以供以后以轻巧的方式打印。

请注意,捕获本地人时,它们也会显示在回溯中。

请注意,捕获本地人时,它们也会显示在回溯中。

如果* chain *不是True,则__cause____context__不会被格式化。

返回值是一个字符串生成器,每个字符串都以换行符结尾,其中一些包含内部换行符。 print_exception()是此方法的包装器,它仅将行打印到文件中。

指示发生哪个异常的消息始终是输出中的最后一个字符串。

返回值是一个字符串生成器,每个字符串都以换行符结尾。

通常,生成器发出一个字符串。但是,对于SyntaxErrorexception,它发出几行(在打印时)显示有关语法错误发生位置的详细信息。

指示发生哪个异常的消息始终是输出中的最后一个字符串。

StackSummary Objects

3.5 版中的新Function。

StackSummary对象代表准备好进行格式化的调用堆栈。

如果提供了* limit ,则仅从 frame_gen 中获取这么多帧。如果 lookup_lines False,则返回的FrameSummary对象将尚未读取其行,从而使创建StackSummary的成本降低(如果可能实际上没有被格式化,则可能很有价值)。如果 capture_locals *为True,则将每个FrameSummary中的局部变量捕获为对象表示形式。

对于同一帧和同一行的长序列,将显示前几次重复,其后是摘要行,指出进一步重复的确切次数。

在版本 3.6 中更改:现在缩写了重复帧的长序列。

FrameSummary Objects

3.5 版中的新Function。

FrameSummary对象表示回溯中的单个帧。

Traceback Examples

这个简单的示例实现了一个基本的 read-eval-print 循环,类似于(但比标准的 Python 交互式解释器循环有用)。有关解释器循环的更完整实现,请参阅code模块。

import sys, traceback

def run_user_code(envdir):
    source = input(">>> ")
    try:
        exec(source, envdir)
    except Exception:
        print("Exception in user code:")
        print("-"*60)
        traceback.print_exc(file=sys.stdout)
        print("-"*60)

envdir = {}
while True:
    run_user_code(envdir)

以下示例演示了打印和格式化异常及回溯的不同方法:

import sys, traceback

def lumberjack():
    bright_side_of_death()

def bright_side_of_death():
    return tuple()[0]

try:
    lumberjack()
except IndexError:
    exc_type, exc_value, exc_traceback = sys.exc_info()
    print("*** print_tb:")
    traceback.print_tb(exc_traceback, limit=1, file=sys.stdout)
    print("*** print_exception:")
    # exc_type below is ignored on 3.5 and later
    traceback.print_exception(exc_type, exc_value, exc_traceback,
                              limit=2, file=sys.stdout)
    print("*** print_exc:")
    traceback.print_exc(limit=2, file=sys.stdout)
    print("*** format_exc, first and last line:")
    formatted_lines = traceback.format_exc().splitlines()
    print(formatted_lines[0])
    print(formatted_lines[-1])
    print("*** format_exception:")
    # exc_type below is ignored on 3.5 and later
    print(repr(traceback.format_exception(exc_type, exc_value,
                                          exc_traceback)))
    print("*** extract_tb:")
    print(repr(traceback.extract_tb(exc_traceback)))
    print("*** format_tb:")
    print(repr(traceback.format_tb(exc_traceback)))
    print("*** tb_lineno:", exc_traceback.tb_lineno)

该示例的输出将类似于以下内容:

*** print_tb:
  File "<doctest...>", line 10, in <module>
    lumberjack()
*** print_exception:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** print_exc:
Traceback (most recent call last):
  File "<doctest...>", line 10, in <module>
    lumberjack()
  File "<doctest...>", line 4, in lumberjack
    bright_side_of_death()
IndexError: tuple index out of range
*** format_exc, first and last line:
Traceback (most recent call last):
IndexError: tuple index out of range
*** format_exception:
['Traceback (most recent call last):\n',
 '  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n',
 'IndexError: tuple index out of range\n']
*** extract_tb:
[<FrameSummary file <doctest...>, line 10 in <module>>,
 <FrameSummary file <doctest...>, line 4 in lumberjack>,
 <FrameSummary file <doctest...>, line 7 in bright_side_of_death>]
*** format_tb:
['  File "<doctest...>", line 10, in <module>\n    lumberjack()\n',
 '  File "<doctest...>", line 4, in lumberjack\n    bright_side_of_death()\n',
 '  File "<doctest...>", line 7, in bright_side_of_death\n    return tuple()[0]\n']
*** tb_lineno: 10

以下示例显示了打印和格式化堆栈的不同方法:

>>> import traceback
>>> def another_function():
...     lumberstack()
...
>>> def lumberstack():
...     traceback.print_stack()
...     print(repr(traceback.extract_stack()))
...     print(repr(traceback.format_stack()))
...
>>> another_function()
  File "<doctest>", line 10, in <module>
    another_function()
  File "<doctest>", line 3, in another_function
    lumberstack()
  File "<doctest>", line 6, in lumberstack
    traceback.print_stack()
[('<doctest>', 10, '<module>', 'another_function()'),
 ('<doctest>', 3, 'another_function', 'lumberstack()'),
 ('<doctest>', 7, 'lumberstack', 'print(repr(traceback.extract_stack()))')]
['  File "<doctest>", line 10, in <module>\n    another_function()\n',
 '  File "<doctest>", line 3, in another_function\n    lumberstack()\n',
 '  File "<doctest>", line 8, in lumberstack\n    print(repr(traceback.format_stack()))\n']

最后一个示例演示了最后几个格式化Function:

>>> import traceback
>>> traceback.format_list([('spam.py', 3, '<module>', 'spam.eggs()'),
...                        ('eggs.py', 42, 'eggs', 'return "bacon"')])
['  File "spam.py", line 3, in <module>\n    spam.eggs()\n',
 '  File "eggs.py", line 42, in eggs\n    return "bacon"\n']
>>> an_error = IndexError('tuple index out of range')
>>> traceback.format_exception_only(type(an_error), an_error)
['IndexError: tuple index out of range\n']
首页