traceback打印或检索堆栈追溯

源代码: Lib / traceback.py


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

该模块使用traceback对象 – 这是存储在sys.last_traceback变量中的对象类型,并作为sys.exc_info().

的第三项返回。该模块定义了以下函数:

traceback.print_tbtb, limit=None, file=None

如果limit为正,则打印最多tb来自追踪对象limit的堆栈跟踪条目(从调用者的框架开始)。否则,打印最后的abs(limit)条目。如果省略limitNone,所有条目都已打印。如果省略fileNone,则输出到sys.stderr;否则它应该是一个打开的文件或类似文件的对象来接收输出.

更改版本3.5:添加否定limit support.

traceback.print_exception(etype, value, tb, limit=None, file=None, chain=True)

从traceback对象tb打印异常信息和堆栈跟踪条目到file。这与print_tb()的不同之处在于:

  • 如果tb不是None,它打印一个标题Traceback (most recentcall last):
  • 它会在堆栈跟踪etype之后打印value
  • 异常type(value)SyntaxErrorvalue具有相应的格式,它打印出语法错误发生的行,同时指示错误的大致位置.

可选limit参数与print_tb()的含义相同。如果chain为真(默认值),则链接异常(__cause____context__异常的属性也将被打印出来,就像解释器本身在打印unhandledexception时所做的那样.

在版本3.5中更改:etype参数被忽略并从的类型推断出来value.

traceback.print_exclimit=None, file=None, chain=True

这是print_exception(*sys.exc_info(), limit, file,chain).

traceback.print_lastlimit=None, file=None, chain=True

这是print_exception(sys.last_type, sys.last_value,sys.last_traceback, limit, file, chain)。一般情况下,只有在异常达到交互式提示后才会起作用(见sys.last_type).

traceback.print_stack(f=None, limit=None, file=None)

打印到limit堆栈跟踪条目(从调用点开始)如果limit是积极的。否则,打印最后的abs(limit)条目。如果省略limitNone,则打印所有条目。可选f参数可用于指定备用堆栈帧以启动。可选file参数与的含义相同print_tb().

在版本3.5中更改:添加否定limit支持。

traceback.extract_tbtb, limit=None

返回StackSummary对象,表示从回溯对象中提取的“预处理”堆栈跟踪条目列表tb。它对堆栈跟踪的替代格式化很有用。可选的limit参数与print_tb()的含义相同。“预处理”堆栈traceentry是FrameSummary包含属性的对象filename, lineno,name,和line表示通常为堆栈跟踪打印的信息。该line是一个带有前导和尾随空格的字符串;如果源不可用则是None.

traceback.extract_stackf=None, limit=None

从当前堆栈帧中提取原始回溯。返回值的格式与extract_tb()的格式相同。可选的flimit参数与print_stack().

traceback.format_listextracted_list

的含义相同,给出一个元组列表或FrameSummaryextract_tb()extract_stack()返回的对象,返回准备打印的字符串列表。结果列表中的每个字符串对应于参数列表中具有相同索引的项。每个字符串以换行符结尾;对于源文本行不是None.

traceback.format_exception_onlyetype, value

格式化回溯的异常部分的那些项,字符串也可能包含内部换行符。参数是异常类型和值,例如sys.last_typesys.last_value给出的值。返回值是一个字符串列表,每个字符串以换行符结尾。通常,列表包含单个字符串;但是,对于SyntaxError例外,它包含几行(打印时)显示有关语法错误发生位置的详细信息。指示发生异常的消息是列表中的始终最后一个字符串.

traceback.format_exceptionetype, value, tb, limit=None, chain=True

格式化堆栈跟踪和异常信息。参数与print_exception()。其中的值是一个字符串列表,每个字符串以换行符结尾,一些包含内部换行符。连接和打印这些行时,打印的文本与print_exception().

更改版本3.5: etype参数被忽略并从value.

traceback.format_exclimit=None, chain=True

的类型推断出这就像是print_exc(limit)但是返回一个字符串而不是打印到一个文件.

traceback.format_tb (tb, limit=None )

的简写format_list(extract_tb(tb, limit)).

traceback.format_stackf=None, limit=None

的简写format_list(extract_stack(f, limit)).

traceback.clear_framestb

清除回溯中所有堆栈帧的局部变量tb通过拨打clear()每个框架对象的方法.

版本3.4.

traceback.walk_stackf

f.f_back从给定的帧中,产生每帧的帧和行号。如果fNone,当前的堆栈被使用。这个助手和StackSummary.extract().

一起用于3.5版本的新版.

traceback.walk_tbtb)

跟踪tb_next产生每帧的帧和行号。这个助手和StackSummary.extract().

版本3.5中的新功能

该模块还定义了以下类:

TracebackException对象

版本3.5中的新功能

TracebackException对象是根据实际异常创建的,用于以后以轻量级方式打印数据.

class traceback.TracebackException(exc_type, exc_value, exc_traceback, *, limit=None, lookup_lines=True, capture_locals=False)

捕获异常以便以后渲染。limit, lookup_linescapture_localsStackSummaryclass.

注意当当地人被捕时,它们也会在追溯中显示.

__cause__

A TracebackException原来的__cause__.

__context__

A TracebackException原始__context__.

__suppress_context__

__suppress_context__原始异常值

stack

一个StackSummary代表traceback.

exc_type

原始traceback的类.

filename

对于语法错误 – 发生错误的文件名.

lineno

对于语法错误 – 发生错误的行号.

text

对于语法错误 – 发生错误的文本.

offset

对于语法错误 – 发生错误的文本的偏移量.

msg

对于语法错误 – 编译器错误消息.

classmethod from_exception(exc, *, limit=None, lookup_lines=True, capture_locals=False)

捕获异常以便以后渲染。limit, lookup_linescapture_locals就像StackSummary

请注意,当捕获本地时,它们也会显示在traceback中.

format*, chain=True

格式化异常.

如果chain不是 True, __cause____context__不会格式化的.

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

指示发生了哪个异常的消息始终是输出中的持续字符串.

format_exception_only)

格式化跟踪的异常部分.

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

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

指示发生了哪个异常的消息始终是输出中的laststring .

StackSummary对象

版本3.5中的新增.

StackSummary对象表示准备格式化的调用堆栈.

class traceback.StackSummary
classmethod extractframe_gen, *, limit=None, lookup_lines=True, capture_locals=False

从帧生成器构造一个StackSummary对象(例如由walk_stack()walk_tb())返回.

如果提供limit,则仅这个很多的框架是从frame_gen取的。如果lookup_linesFalse,退回FrameSummary对象还没有读过他们的行,这就造成了创建StackSummary更便宜(如果它实际上没有格式化可能是有价值的)。如果capture_localsTrue每个局部变量FrameSummary被捕为对象代表

classmethod from_lista_list

构建一个StackSummary提供的FrameSummary对象或旧式元组列表。每个元组应该是一个4元组,文件名,行号,名称,行作为元素.

format ()

返回准备打印的字符串列表。结果列表中的每个字符串对应于堆栈中的一个帧。每个字符串以换行符结尾;对于具有源文本行的那些项,字符串也可以包含内部新行.

对于同一帧和行的长序列,显示前几个重复,然后是一个汇总行,说明进一步重复的确切数量。

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

FrameSummary对象

版本3.5中的新内容

FrameSummary//对象表示traceback中的单个帧.

class traceback.FrameSummary (filename, lineno, name, lookup_line=True, locals=None, line=None)

表示正在进行格式化或打印的回溯或堆栈中的单个帧。它可以选择包含其中包含的framelocals的字符串化版本。如果lookup_lineFalse,在FrameSummaryline访问属性(在将其转换为元组时也会发生).line可以直接提供,并且会阻止linelookup发生。locals是一个可选的局部variabledictionary,如果提供的话,变量表示将存储在总结中以供以后显示.

Traceback示例

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

import sys, tracebackdef 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, tracebackdef 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"]

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

>>> 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"]

评论被关闭。