​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

相关文章

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

【北交大信息所AI-Max2】使用方法

BJTU信息所集群AI_MAX2使用方法 使用的前提是预约到相应的算力卡,拥有登录权限的账号密码,一般为导师组共用一个。 有浏览器、ssh工具就可以。 1.新建集群Terminal 浏览器登陆10.126.62.75 (如果是1集群把75改成66) 交互式开发 执行器选Terminal 密码随便设一个(需记住) 工作空间:私有数据、全部文件 加速器选GeForce_RTX_2080_Ti

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

Verybot之OpenCV应用三:色标跟踪

下面的这个应用主要完成的是Verybot跟踪色标的功能,识别部分还是居于OpenCV编写,色标跟踪一般需要将图像的颜色模式进行转换,将RGB转换为HSV,因为对HSV格式下的图像进行识别时受光线的影响比较小,但是也有采用RGB模式来进行识别的情况,这种情况一般光线条件比较固定,背景跟识别物在颜色上很容易区分出来。         下面这个程序的流程大致是这样的:

Linux命令(11):系统信息查看命令

系统 # uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostname # 查看计算机名# lspci -tv # 列出所有PCI设备# lsusb -tv

【小迪安全笔记 V2022 】信息打点9~11

第9天 信息打点-CDN绕过篇&漏洞回链8接口探针&全网扫指&反向件 知识点: 0、CDN知识-工作原理及阻碍 1、CDN配置-域名&区域&类型 2、CDN绕过-靠谱十余种技战法 3、CDN绑定-HOSTS绑定指向访问 CDN 是构建在数据网络上的一种分布式的内容分发网。 CDN的作用是采用流媒体服务器集群技术,克服单机系统输出带宽及并发能力不足的缺点,可极大提升系统支持的并发流数目,减少或避

Weex入门教程之4,获取当前全局环境变量和配置信息(屏幕高度、宽度等)

$getConfig() 获取当前全局环境变量和配置信息。 Returns: config (object): 配置对象;bundleUrl (string): bundle 的 url;debug (boolean): 是否是调试模式;env (object): 环境对象; weexVersion (string): Weex sdk 版本;appName (string): 应用名字;

argodb自定义函数读取hdfs文件的注意点,避免FileSystem已关闭异常

一、问题描述 一位同学反馈,他写的argo存过中调用了一个自定义函数,函数会加载hdfs上的一个文件,但有些节点会报FileSystem closed异常,同时有时任务会成功,有时会失败。 二、问题分析 argodb的计算引擎是基于spark的定制化引擎,对于自定义函数的调用跟hive on spark的是一致的。udf要通过反射生成实例,然后迭代调用evaluate。通过代码分析,udf在

多数据源的事务处理总是打印很多无用的log日志

之前做了一个项目,需要用到多数据源以及事务处理,在使用事务处理,服务器总是打印很多关于事务处理的log日志(com.atomikos.logging.Slf4jLogger),但是我们根本不会用到这些log日志,反而使得查询一些有用的log日志变得困难。那要如何屏蔽这些log日志呢? 之前的项目是提高项目打印log日志的级别,后来觉得这样治标不治本。 现在有一个更好的方法: 我使用的是log

下载/保存/读取 文件,并转成流输出

最近对文件的操作又熟悉了下;现在记载下来:学习在于 坚持!!!不以细小而不为。 实现的是:文件的下载、文件的保存到SD卡、文件的读取输出String 类型、最后是文件转换成流输出;一整套够用了; 重点: 1:   操作网络要记得开线程; 2:更新网络获取的数据 切记用Handler机制; 3:注意代码的可读性(这里面只是保存到SD卡,在项目中切记要对SD卡的有无做判断,然后再获取路径!)