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

news/2024/4/19 1:19:06

源代码: 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']

http://www.ppmy.cn/news/1269436.html

相关文章

水库大坝安全监测参数与设备

智慧水利中&#xff0c;水库大坝的安全监测必不可少。做好水库大坝的安全监测&#xff0c;是确保水库大坝结构安全和预防灾害的重要手段。对于预防灾害、保护人民生命财产安全、优化工程管理、改进工程设计、保护环境资源和提高公众信任等方面有着重要的意义。 水利水库大坝安全…

修改jvm对象的属性值(私有)

修改jvm对象的属性值(私有) 这个想法的来源 一个spark job 在启动之后&#xff0c;就会确定 executor 的数量。但是存在一种情况&#xff0c;当我的队列资源宽松 可能就要调整一些job的资源&#xff0c;但是spark job在启动的时候&#xff0c;最大的资源就确定了&#xff0c;…

HTML的img常见应用属性

目录 一、src、alt、width、height 的运用二、title的运用三、align的运用四、border的运用 一、src、alt、width、height 的运用 src指定图像的URL&#xff0c;即图像的路径alt指定图像的替代文本&#xff0c;当图像无法显示时&#xff0c;会显示替代文本。width指定图像的宽…

【react.js + hooks】useVirtualArea 渲染虚拟列表

useVirtualArea Hook useVirtualArea 是一个 React Hook&#xff0c;用于创建虚拟列表。虚拟列表是一种优化技术&#xff0c;用于在不影响性能的情况下显示大量数据。 参数 useVirtualArea 接受一个对象和一个数组作为参数&#xff0c;该对象包含以下属性&#xff1a; load…

安装 DevEco Studio 后不能用本地 Node.js 打开

安装 DevEco Studio 后第一次打开时&#xff0c;不能用本地 Node.js 打开 答&#xff1a;因为本地 Node.js 文件夹名字中有空格 Node.js路径只能包含字母、数字、“。”、“_”、“-”、“:”和“V” 解决方法&#xff1a; 1.修改文件夹名称 2.重新下载 注意&#xff1a;找一…

MetricBeat监控Redis

目录 一、安装部署 二、开启Redis监控模块 三、编辑Redis配置文件 四、启动Metricbeat 五、查看监控图表 一、安装部署 metriceat的安装部署参考章节&#xff1a; 监控组件>Metricbeat安装使用&#xff0c;这里不再赘述。 二、开启Redis监控模块 进入metricbeat安装目录…

Python-docx 深入word源码 自定义字符间距

代码和实现效果 from docx import Document from docx.oxml import OxmlElement from docx.oxml.ns import qn from docx.shared import Pt# 调整pt设置字间距 def SetParagraphCharSpaceByPt(run, pt1):通过修改word源码方式, 添加w:spacing标签直接通过调整pt来设置字符间距…

02 python语句判断

2.1 布尔类型与比较运算符 演示bool类型的定义 比较运算符的应用# 定义变量储存布尔类型的数据 bool1True bool2False print(fbool1变量的内容是&#xff1a;{bool1},其类型是{type(bool1)}) print(fbool2变量的内容是&#xff1a;{bool2},其类型是{type(bool2)})# 比较运算符的…

web前端之使用弹性和外边距进行网页布局、非常有用的小技巧、flex、margin、auto

MENU 效果图htmlcss解析 效果图 图中效果只需要flex和margin便可以实现。 html <div class"w_100_ d_f h_168 p_6 bc_c0c0c0"><div class"w_50 h_50 bc_e75f57 m_a"></div> </div><div class"w_100_ d_f p_6 mt_20 bc_c0…

华为OD机试 - 数的分解(Java JS Python C)

题目描述 给定一个正整数 n,如果能够分解为 m(m > 1)个连续正整数之和,请输出所有分解中,m最小的分解。 如果给定整数无法分解为连续正整数,则输出字符串"N"。 输入描述 输入数据为一整数,范围为 (1, 2^30] 输出描述 比如输入为: 21 输出: 21=10+11 …

橘子学K8S01之容器中所谓的隔离

我们一直都在说容器就是一个沙盒&#xff0c;沙盒技术顾名思义就是像一个集装箱一样&#xff0c;把应用(服务&#xff0c;进程之类的)装起来的技术&#xff0c;这样每个进程在自己的沙盒中和其他的沙盒隔离开来&#xff0c;每个沙盒之间存在一个边界使得他们互不干扰&#xff0…

如何预防最新的.halo勒索病毒感染您的计算机?

导言&#xff1a; 数据的安全性愈发成为人们关注的焦点&#xff0c;而.halo勒索病毒的出现给数字生活带来了严重的威胁。本文91数据恢复将深入介绍.halo勒索病毒的特征&#xff0c;提供有效的数据恢复方法&#xff0c;并分享一些预防措施&#xff0c;助您更好地保护自己的数字…

用友时空 KSOA 多处SQL注入漏洞复现

0x01 产品简介 用友时空 KSOA 是建立在 SOA 理念指导下研发的新一代产品,是根据流通企业前沿的 IT 需求推出的统一的IT基础架构,它可以让流通企业各个时期建立的 IT 系统之间彼此轻松对话。 0x02 漏洞概述 用友时空 KSOA 系统 PayBill、QueryService、linkadd.jsp等接口处…

Amazon SageMaker: 拓展机器学习边界,塑造未来创新趋势

授权说明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道。 近期在 re:Invent 2023 大会上&#xff0c;亚马逊云科技发布了一…

利用 Python 进行数据分析实验(五)

一、实验目的 使用Python解决问题 二、实验要求 自主编写并运行代码&#xff0c;按照模板要求撰写实验报告 三、实验步骤 1 爬取并下载当当网某一本书的网页内容&#xff0c;并保存为html格式 2 在豆瓣网上爬取某本书的前50条短评内容并计算评分的平均值(自学正则表达式) …

6-46.矩阵运算

根据main函数中矩阵对象的定义与使用&#xff0c;定义相关的矩阵类Array&#xff0c;并利用运算符重载的方法实现矩阵的加法与输入输出操作。&#xff08;为简化问题&#xff0c;矩阵中元素为2位以内整数&#xff0c;要求矩阵按照行列的格式输出&#xff0c;每个元素占3位宽度&…

变电站蓄电池在线监测系统(论文+源码)

1. 系统设计 本次课题为变电站蓄电池在线监测系统的设计&#xff0c;其系统架构如图3.1所示&#xff0c;包括了主控制器STC89C52单片机&#xff0c;液晶显示器LCD1602,模数转换器ADC0832&#xff0c;电流传感器ACS712&#xff0c;分压电阻&#xff0c;蜂鸣器以及温度传感器。在…

Kafka事务是怎么实现的?Kafka事务消息原理详解(文末送书)

目录 一、Kafka事务性消息1.1 介绍Kafka事务性消息1.2 事务性消息的应用场景1.3 Kafka事务性消息的优势 二、Kafka事务性消息的使用2.1 配置Kafka以支持事务性消息生产者配置消费者配置 2.2 生产者&#xff1a;发送事务性消息创建Kafka生产者开始事务发送消息提交或中止事务 2.…

【STM32CubeMX】F103 BxCAN

F103&BxCAN bxCAN总体描述 有一个增强的过滤机制来处理各种类型的报文此外&#xff0c;应用层任务需要更多CPU时间&#xff0c;因此报文接收所需的实时响应程度需要减轻。 接收FIFO的方案允许&#xff0c;CPU花很长时间处理应用层任务而不会丢失报文。 构筑在底层CAN驱动程…

VS2022 将项目打包,导出为exe运行

我有一个在 VS2022 上开发的程序&#xff0c;基于.net 6框架, 想打包成 .exe程序&#xff0c;以在另一个没有安装VS的机器上运行&#xff0c;另一个机器是Win7系统&#xff0c;上面安装了.net 6框架。 虽然网上很多教程&#xff0c;需要安装Project Installer&#xff0c;配置A…