​traceback —— 打印或读取堆栈的跟踪信息​

2023-12-14 22:52

本文主要是介绍​traceback —— 打印或读取堆栈的跟踪信息​,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

源代码: Lib/traceback.py


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

The module uses traceback objects --- these are objects of type types.TracebackType, which are assigned to the __traceback__ field of BaseException instances.

参见

模块 faulthandler

用于在发生错误、超时或用户信号时显式地转储 Python 回溯信息。

模块 pdb

用于 Python 程序的交互式源代码调试器。

这个模块定义了以下函数:

traceback.print_tb(tblimit=Nonefile=None)

如果*limit*是正整数,那么从 traceback 对象 "tb" 输出最高 limit 个(从调用函数开始的)栈的堆栈回溯‎条目‎;如果 limit 是负数就输出 abs(limit) 个回溯条目;又如果 limit 被省略或者为 None ,那么就会输出所有回溯条目。如果 file 被省略或为 None 那么就会输出至标准输出 sys.stderr 否则它应该是一个打开的文件或者文件类对象来接收输出

在 3.5 版更改: 添加了对负数值 limit 的支持

traceback.print_exception(exc/, [valuetb, ]limit=Nonefile=Nonechain=True)

打印回溯对象 tb 到 file 的异常信息和整个堆栈回溯。这和 print_tb() 比有以下方面不同:

  • 如果 tb 不为 None,它将打印头部 Traceback (most recent call last):

  • 它将在栈回溯之后打印异常类型和 value

  • 如果 type(value) 为 SyntaxError 且 value 具有适当的格式,它会打印发生语法错误的行并用一个圆点来指明错误的大致位置。

从 Python 3.10 开始,可以不再传递 value 和 tb,而是传递一个异常对象作为第一个参数。 如果提供了 value 和 tb,则第一个参数会被忽略以便提供向下兼容性。

The optional limit argument has the same meaning as for print_tb(). If chain is true (the default), then chained exceptions (the __cause__ or __context__ attributes of the exception) will be printed as well, like the interpreter itself does when printing an unhandled exception.

在 3.5 版更改: etype 参数会被忽略并根据 value 推断出来。

在 3.10 版更改: etype 形参已被重命名为 exc 并且现在是仅限位置形参。

traceback.print_exc(limit=Nonefile=Nonechain=True)

这是 print_exception(sys.exception(), limit, file, chain) 的快捷操作。

traceback.print_last(limit=Nonefile=Nonechain=True)

这是 print_exception(sys.last_exc, limit, file, chain) 的一个快捷方式。 通常它将只在异常到达交互提示符之后才会起作用 (参见 sys.last_exc)。

traceback.print_stack(f=Nonelimit=Nonefile=None)

如果 limit 为正数则打印至多 limit 个栈回溯条目(从发起调用点开始)。 在其他情况下,则打印最后 abs(limit) 个条目。 如果 limit 被省略或为 None,则会打印所有条目。 可选的 f 参数可被用来指明一个用于开始的替代栈。 可选的 file 参数具有与 print_tb() 的相同含义。

在 3.5 版更改: 添加了对负数值 limit 的支持

traceback.extract_tb(tblimit=None)

返回一个 StackSummary 对象来代表从回溯对象 tb 提取的 "预处理" 栈回溯条目列表。 它适用于栈回溯的替代格式化。 可选的 limit 参数具有与 print_tb() 的相同含义。 "预处理" 栈回溯条目是一个 FrameSummary 对象,其中包含代表通常为栈回溯打印的信息的 filenamelinenoname 和 line 等属性。 line 是一个去除了前导和末尾空白符的字符串;如果源代码不可用则它将为 None

traceback.extract_stack(f=Nonelimit=None)

从当前的栈帧提取原始回溯信息。 返回值具有与 extract_tb() 的相同格式。 可选的 f 和 limit 参数具有与 print_stack() 的相同含义。

traceback.format_list(extracted_list)

给定一个由元组或如 extract_tb() 或 extract_stack() 所返回的 FrameSummary 对象组成的列表,返回一个可打印的字符串列表。 结果列表中的每个字符串都对应于参数列表中具有相同索引号的条目。 每个字符串以一个换行符结束;对于那些源文本行不为 None 的条目,字符串也可能包含内部换行符。

traceback.format_exception_only(exc/[, value])

使用 sys.last_value 等给出的异常值来格式化回溯中的异常部分。 返回值是一个字符串的列表,每个字符串都以换行符结束。 该列表包含异常消息,它通常是一个字符串;但是,对于 SyntaxError 异常,它将包含多行并且(当打印时)会显示语法错误发生位置的详细信息。 在异常消息之后,该列表还包含了异常的 注释。

从 Python 3.10 开始,可以不传入 value,而是传入一个异常对象作为第一个参数。 如果提供了 value,则第一个参数将被忽略以便提供向下兼容性。

在 3.10 版更改: etype 形参已被重命名为 exc 并且现在是仅限位置形参。

在 3.11 版更改: 返回的列表现在包括关联到异常的任何注释。

traceback.format_exception(exc/, [valuetb, ]limit=Nonechain=True)

格式化一个栈跟踪和异常信息。 参数的含义与传给 print_exception() 的相应参数相同。 返回值是一个字符串列表,每个字符串都以一个换行符结束且有些还包含内部换行符。 当这些行被拼接并打印时,打印的文本与 print_exception() 的完全相同。

在 3.5 版更改: etype 参数会被忽略并根据 value 推断出来。

在 3.10 版更改: 此函数的行为和签名已被修改以与 print_exception() 相匹配。

traceback.format_exc(limit=Nonechain=True)

这类似于 print_exc(limit) 但会返回一个字符串而不是打印到一个文件。

traceback.format_tb(tblimit=None)

是 format_list(extract_tb(tb, limit)) 的简写形式。

traceback.format_stack(f=Nonelimit=None)

是 format_list(extract_stack(f, limit)) 的简写形式。

traceback.clear_frames(tb)

通过调用每个帧对象的 clear() 方法来清除回溯 tb 中所有栈帧的局部变量。

3.4 新版功能.

traceback.walk_stack(f)

从给定的帧开始访问 f.f_back 之后的栈,产生每一帧的帧和行号。 如果 f 为 None,则会使用当前栈。 这个辅助函数要与 StackSummary.extract() 一起使用。

3.5 新版功能.

traceback.walk_tb(tb)

Walk a traceback following tb_next yielding the frame and line number for each frame. This helper is used with StackSummary.extract().

3.5 新版功能.

此模块还定义了以下的类:

TracebackException 对象

3.5 新版功能.

TracebackException 对象基于实际的异常创建通过轻量的方式捕获数据以便随后打印。

class traceback.TracebackException(exc_typeexc_valueexc_traceback*limit=Nonelookup_lines=Truecapture_locals=Falsecompact=Falsemax_group_width=15max_group_depth=10)

捕获一个异常以便随后渲染。 limitlookup_lines 和 capture_locals 的含义与 StackSummary 类的相同。

If compact is true, only data that is required by TracebackException's format() method is saved in the class attributes. In particular, the __context__ field is calculated only if __cause__ is None and __suppress_context__ is false.

请注意当局部变量被捕获时,它们也会被显示在回溯中。

max_group_width 和 max_group_depth 控制异常组的格式化 (参见 BaseExceptionGroup)。 depth 是指分组的嵌套层级,而 width 是指一个异常组的异常数组的大小。 格式化的输出在达到某个限制时将被截断。

在 3.10 版更改: 增加了 compact 形参。

在 3.11 版更改: 添加了 max_group_width 和 max_group_depth 形参。parameters.

__cause__

TracebackException of the original __cause__.

__context__

TracebackException of the original __context__.

exceptions

If self represents an ExceptionGroup, this field holds a list of TracebackException instances representing the nested exceptions. Otherwise it is None.

3.11 新版功能.

__suppress_context__

The __suppress_context__ value from the original exception.

__notes__

The __notes__ value from the original exception, or None if the exception does not have any notes. If it is not None is it formatted in the traceback after the exception string.

3.11 新版功能.

stack

代表回溯的 StackSummary。

exc_type

原始回溯的类。

filename

针对语法错误 —— 错误发生所在的文件名。

lineno

针对语法错误 —— 错误发生所在的行号。

end_lineno

针对语法错误 —— 错误发生所在的末尾行号。 如不存在则可以为 None

3.10 新版功能.

text

针对语法错误 —— 错误发生所在的文本。

offset

针对语法错误 —— 错误发生所在的文本内部的偏移量。

end_offset

针对语法错误 —— 错误发生所在的文本末尾偏移量。 如不存在则可以为 None

3.10 新版功能.

msg

针对语法错误 —— 编译器错误消息。

classmethod from_exception(exc*limit=Nonelookup_lines=Truecapture_locals=False)

捕获一个异常以便随后渲染。 limitlookup_lines 和 capture_locals 的含义与 StackSummary 类的相同。

请注意当局部变量被捕获时,它们也会被显示在回溯中。

print(*file=Nonechain=True)

将 format() 所返回的异常信息打印至 file (默认为 sys.stderr)。

3.11 新版功能.

format(*chain=True)

格式化异常。

If chain is not True, __cause__ and __context__ will not be formatted.

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

format_exception_only()

格式化回溯的异常部分。

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

生成器会发出异常消息并附带其注释(如果有注释的话)。 异常消息通常是一个字符串;但是,对于 SyntaxError 异常,它将包含多行并且(当打印时)会显示语法错误发生位置的详细信息。

在 3.11 版更改: 异常的注释现在将被包括在输出中。

StackSummary 对象

3.5 新版功能.

代表一个可被格式化的调用栈的 StackSummary 对象。

class traceback.StackSummary

classmethod extract(frame_gen*limit=Nonelookup_lines=Truecapture_locals=False)

构造一个来自帧生成器的 StackSummary 对象(如 walk_stack() 或 walk_tb() 所返回的一样)。

如果提供了 limit,则只从 frame_gen 提取指定数量的帧。 如果 lookup_lines 为 False,则返回的 FrameSummary 对象将不会读入它们的行,这使得创建 StackSummary 的开销更低(如果它不会被实际格式化这就会很有价值)。 如果 capture_locals 为 True 则每个 FrameSummary 中的局部变量会被捕获为对象表示形式。

在 3.12 版更改: 在局部变量的 repr() 上被引发的异常(当 capture_locals 为 True 时)不会再被传播给调用方。

classmethod from_list(a_list)

从所提供的 FrameSummary 对象列表或旧式的元组列表构造一个 StackSummary 对象。 每个元组都应当是以文件、行号、名称和行为元素的 4 元组。

format()

返回一个可打印的字符串列表。 结果列表中的每个字符串各自对应来自于栈的单独帧。 每个字符串都以一个换行符结束;对于带有源文本行的条目来说,字符串还可能包含内部换行符。

对于同一帧与行的长序列,将显示前几个重复项,后面跟一个指明之后的实际重复次数的摘要行。

在 3.6 版更改: 重复帧的长序列现在将被缩减。

format_frame_summary(frame_summary)

返回用于打印栈中涉及的某一帧的字符串。 此方法会为每个要用 StackSummary.format() 来打印的 FrameSummary 对象进行调用。 如果它返回 None,该帧将从输出中被省略。

3.11 新版功能.

FrameSummary 对象

3.5 新版功能.

FrameSummary 对象代表回溯中的一个单独帧。

class traceback.FrameSummary(filenamelinenonamelookup_line=Truelocals=Noneline=None)

代表回溯或栈中被格式化或打印的一个单独帧。 它有时可能还带有包括在其中的帧局部变量的字符串化版本。 如果 lookup_line 为 False,则不会查找源代码直到 FrameSummary 已经访问了 line 属性(这还将发生在将其转换为元组时)。 line 可能会被直接提供,并将完全阻止行查找的发生。 locals 是一个可选的局部变量字典,如果有提供的话这些变量的表示形式将被存储在摘要中以便随后显示。

回溯示例

这个简单示例是一个基本的读取-求值-打印循环,类似于(但实用性小于)标准 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_life()def bright_side_of_life():return tuple()[0]try:lumberjack()
except IndexError:exc = sys.exception()print("*** print_tb:")traceback.print_tb(exc.__traceback__, limit=1, file=sys.stdout)print("*** print_exception:")traceback.print_exception(exc, 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:")print(repr(traceback.format_exception(exc)))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 lumberjackbright_side_of_life()
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 lumberjackbright_side_of_life()
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 default[0]>", line 10, in <module>\n    lumberjack()\n','  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n','  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\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_life>]
*** format_tb:
['  File "<doctest default[0]>", line 10, in <module>\n    lumberjack()\n','  File "<doctest default[0]>", line 4, in lumberjack\n    bright_side_of_life()\n','  File "<doctest default[0]>", line 7, in bright_side_of_life\n    return tuple()[0]\n           ~~~~~~~^^^\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_functionlumberstack()File "<doctest>", line 6, in lumberstacktraceback.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']

这篇关于​traceback —— 打印或读取堆栈的跟踪信息​的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/494175

相关文章

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

SpringBoot如何对密码等敏感信息进行脱敏处理

《SpringBoot如何对密码等敏感信息进行脱敏处理》这篇文章主要为大家详细介绍了SpringBoot对密码等敏感信息进行脱敏处理的几个常用方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录​1. 配置文件敏感信息脱敏​​2. 日志脱敏​​3. API响应脱敏​​4. 其他注意事项​​总结

springboot实现配置文件关键信息加解密

《springboot实现配置文件关键信息加解密》在项目配置文件中常常会配置如数据库连接信息,redis连接信息等,连接密码明文配置在配置文件中会很不安全,所以本文就来聊聊如何使用springboot... 目录前言方案实践1、第一种方案2、第二种方案前言在项目配置文件中常常会配置如数据库连接信息、Red

如何使用 Python 读取 Excel 数据

《如何使用Python读取Excel数据》:本文主要介绍使用Python读取Excel数据的详细教程,通过pandas和openpyxl,你可以轻松读取Excel文件,并进行各种数据处理操... 目录使用 python 读取 Excel 数据的详细教程1. 安装必要的依赖2. 读取 Excel 文件3. 读

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)

《使用Python从PPT文档中提取图片和图片信息(如坐标、宽度和高度等)》PPT是一种高效的信息展示工具,广泛应用于教育、商务和设计等多个领域,PPT文档中常常包含丰富的图片内容,这些图片不仅提升了... 目录一、引言二、环境与工具三、python 提取PPT背景图片3.1 提取幻灯片背景图片3.2 提取