– 打印或检索堆栈追溯 – Python运行时服务(Python教程)(参考资料)
traceback
– 打印或检索堆栈追溯
源代码: Lib / traceback.py
该模块提供了一个标准接口,用于提取,格式化和打印Python程序的堆栈跟踪。它在打印堆栈跟踪时完全模仿了Python解释器的行为。当您想要在程序控制下打印堆栈跟踪时,这非常有用,例如在解释器周围的“包装器”中
该模块使用traceback对象 – 这是存储在sys.last_traceback
变量中的对象类型,并作为sys.exc_info()
.
的第三项返回。该模块定义了以下函数:
traceback.
print_tb
(tb, limit=None, file=None)-
如果limit为正,则打印最多tb来自追踪对象limit的堆栈跟踪条目(从调用者的框架开始)。否则,打印最后的
abs(limit)
条目。如果省略limit或None
,所有条目都已打印。如果省略file或None
,则输出到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)是
SyntaxError
和value具有相应的格式,它打印出语法错误发生的行,同时指示错误的大致位置.
可选limit参数与
print_tb()
的含义相同。如果chain为真(默认值),则链接异常(__cause__
或__context__
异常的属性也将被打印出来,就像解释器本身在打印unhandledexception时所做的那样.在版本3.5中更改:etype参数被忽略并从的类型推断出来value.
- 如果tb不是
traceback.
print_exc
(limit=None, file=None, chain=True)
traceback.
print_last
(limit=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)
条目。如果省略limit或None
,则打印所有条目。可选f参数可用于指定备用堆栈帧以启动。可选file参数与的含义相同print_tb()
.在版本3.5中更改:添加否定limit支持。
traceback.
extract_tb
(tb, limit=None)-
返回
StackSummary
对象,表示从回溯对象中提取的“预处理”堆栈跟踪条目列表tb。它对堆栈跟踪的替代格式化很有用。可选的limit参数与print_tb()
的含义相同。“预处理”堆栈traceentry是FrameSummary
包含属性的对象filename
,lineno
,name
,和line
表示通常为堆栈跟踪打印的信息。该line
是一个带有前导和尾随空格的字符串;如果源不可用则是None
.
traceback.
extract_stack
(f=None, limit=None)-
从当前堆栈帧中提取原始回溯。返回值的格式与
extract_tb()
的格式相同。可选的f和limit参数与print_stack()
.
traceback.
format_list
(extracted_list)-
的含义相同,给出一个元组列表或
FrameSummary
由extract_tb()
或extract_stack()
返回的对象,返回准备打印的字符串列表。结果列表中的每个字符串对应于参数列表中具有相同索引的项。每个字符串以换行符结尾;对于源文本行不是None
.
traceback.
format_exception_only
(etype, value)-
格式化回溯的异常部分的那些项,字符串也可能包含内部换行符。参数是异常类型和值,例如
sys.last_type
和sys.last_value
给出的值。返回值是一个字符串列表,每个字符串以换行符结尾。通常,列表包含单个字符串;但是,对于SyntaxError
例外,它包含几行(打印时)显示有关语法错误发生位置的详细信息。指示发生异常的消息是列表中的始终最后一个字符串.
traceback.
format_exception
(etype, value, tb, limit=None, chain=True)-
格式化堆栈跟踪和异常信息。参数与
print_exception()
。其中的值是一个字符串列表,每个字符串以换行符结尾,一些包含内部换行符。连接和打印这些行时,打印的文本与print_exception()
.更改版本3.5: etype参数被忽略并从value.
traceback.
format_exc
(limit=None, chain=True)-
的类型推断出这就像是
print_exc(limit)
但是返回一个字符串而不是打印到一个文件.
traceback.
format_tb
(tb, limit=None )-
的简写
format_list(extract_tb(tb, limit))
.
traceback.
format_stack
(f=None, limit=None)-
的简写
format_list(extract_stack(f, limit))
.
traceback.
clear_frames
(tb)-
清除回溯中所有堆栈帧的局部变量tb通过拨打
clear()
每个框架对象的方法.版本3.4.
traceback.
walk_stack
(f)-
在
f.f_back
从给定的帧中,产生每帧的帧和行号。如果f是None
,当前的堆栈被使用。这个助手和StackSummary.extract()
.一起用于3.5版本的新版.
traceback.
walk_tb
(tb)-
跟踪
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_lines和capture_locals是
StackSummary
class.注意当当地人被捕时,它们也会在追溯中显示.
__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_lines和capture_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
extract
(frame_gen, *, limit=None, lookup_lines=True, capture_locals=False) -
从帧生成器构造一个
StackSummary
对象(例如由walk_stack()
或walk_tb()
)返回.如果提供limit,则仅这个很多的框架是从frame_gen取的。如果lookup_lines是
False
,退回FrameSummary
对象还没有读过他们的行,这就造成了创建StackSummary
更便宜(如果它实际上没有格式化可能是有价值的)。如果capture_locals是True
每个局部变量FrameSummary
被捕为对象代表
- classmethod
from_list
(a_list) -
构建一个
StackSummary
提供的FrameSummary
对象或旧式元组列表。每个元组应该是一个4元组,文件名,行号,名称,行作为元素.
format
()-
返回准备打印的字符串列表。结果列表中的每个字符串对应于堆栈中的一个帧。每个字符串以换行符结尾;对于具有源文本行的那些项,字符串也可以包含内部新行.
对于同一帧和行的长序列,显示前几个重复,然后是一个汇总行,说明进一步重复的确切数量。
在版本3.6中更改:重复帧的长序列现在缩写为
- classmethod
FrameSummary
对象
版本3.5中的新内容
FrameSummary
//对象表示traceback中的单个帧.
- class
traceback.
FrameSummary
(filename, lineno, name, lookup_line=True, locals=None, line=None) -
表示正在进行格式化或打印的回溯或堆栈中的单个帧。它可以选择包含其中包含的framelocals的字符串化版本。如果lookup_line是
False
,在FrameSummary
有line
访问属性(在将其转换为元组时也会发生).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"]
评论被关闭。