Python进阶之-traceback详解

✨前言:

在日常开发中,我们会做一些基本的异常处理,但是有时候只能打印我们处理的结果或者将异常打印出来,不能直观的知道在哪个文件中的哪一行出错。在Python中,traceback是一个用来跟踪异常错误信息的标准库,常用于异常处理和调试。它可以帮助开发者了解异常发生的上下文,并提供关于异常发生处的调用堆栈的信息。在实际开发中,通过使用traceback模块,可以更清晰地看到错误发生的位置及其前后调用关系,从而帮助快速定位并修复问题。

✨一、traceback介绍

如下的函数中,如果只是普通的print的话,这里输出的error并不能让我们很好的找到具体错误的地方,但如果换成traceback的方式,就能很好的定位错误信息了。

import traceback


def function_a():
    print("function_a")
    function_b()


def function_b():
    print("function_b")
    function_c()


def function_c():
    print("function_c")
    raise Exception("error")


if __name__ == '__main__':
    try:
        function_a()
    except Exception as e:
        # print(e)
        traceback.print_exc()

'''
print输出方式:
function_a
function_b
function_c
error
'''

'''
Traceback方式输出:
Traceback (most recent call last):
  File "D:\PycharmProjects\debug_test\psutil_test.py", line 29, in <module>
    function_a()
  File "D:\PycharmProjects\debug_test\psutil_test.py", line 14, in function_a
    function_b()
  File "D:\PycharmProjects\debug_test\psutil_test.py", line 19, in function_b
    function_c()
  File "D:\PycharmProjects\debug_test\psutil_test.py", line 24, in function_c
    raise Exception("error")
Exception: error
'''

🌟1.1 traceback.print_exc():

traceback.print_exc(limit=None, file=None, chain=True)

📌说明:

这个函数用于打印异常信息到标准错误输出(通常是控制台)。它是在知道发生异常但希望程序能继续运行(不崩溃退出)时使用的。如果提供,file参数允许你指定一个输出流,它可以是任何有write()方法的对象,比如文件或者io.StringIO对象。

limit参数用于限定堆栈跟踪信息的打印深度。如果是正数,表示从堆栈的顶部(即异常发生点)开始的最大帧数;如果是负数,表示从堆栈的底部开始的最大帧数。默认(None)则打印全部堆栈信息。
file 参数默认为None,这意味着错误信息将被打印到sys.stderr。通过提供file参数,可以将错误信息输出到其他地方。
chain 参数控制是否显示异常链(对于Python3.3+引入的异常链)。如果为True(默认),则会连同原始异常(如果有的话)一起打印。

打印到标准错误的异常信息,这是使用traceback的最常见方式。如果你不确定如何处理某个异常,可以使用这个函数打印出异常信息而不让程序崩溃。

import traceback
import sys


def func1():
    raise IOError("An io error occurred")


def func2():
    func1()


try:
    func2()
except:
    print("Caught an exception:")
    traceback.print_exc()

在这里插入图片描述

🌟1.2 traceback.format_exc():

traceback.format_exc(limit=None, chain=True)

与print_exc()类似,这个函数返回异常的跟踪信息字符串而不是将其打印出来。可以用来获取异常信息,便于日志记录或通过网络发送。
📌说明

limit 参数作用与print_exc()中相同,用于限制堆栈跟踪信息的深度。 chain
参数与print_exc()中的用法一样,控制是否包含异常链信息。
这个函数非常有用,当你想要将异常信息记录到日志文件或者数据库,或者需要将异常信息通过网络发送到其他系统进行分析时。

import traceback
import sys


def func1():
    raise IOError("An io error occurred")


def func2():
    func1()


try:
    func2()
except:

    print("\nFormatted Exception Information:")
    print(traceback.format_exc())

在这里插入图片描述

🌟1.3 traceback.extract_tb():

traceback.extract_tb(tb, limit=None)

此函数用于从traceback对象(通常是通过sys.exc_info()得到的)提取堆栈跟踪条目,并以一个列表的形式返回。每个条目是一个四元组(filename, line number, function name, text),表示堆栈中的一个级别。
📌说明

tb 参数是一个traceback对象,必须提供。 limit
参数同样用来控制返回的堆栈跟踪条目的数量。规则同print_exc()和format_exc()中的limit参数。
通过这个函数,你可以得到一个堆栈跟踪的详细列表,这对于分析异常的原因和定位问题发生的代码位置非常有用。你可以遍历这个列表,得到每一级堆栈的文件名、行号、函数名和具体的代码行。

import traceback
import sys


def func1():
    raise IOError("An io error occurred")


def func2():
    func1()


try:
    func2()
except:

    exc_type, exc_value, exc_tb = sys.exc_info()
    print("\nExtracted traceback from traceback object:")
    extracted_tb = traceback.extract_tb(exc_tb)
    for frame in extracted_tb:
        filename, lineno, func_name, text = frame
        print(f"File : {filename}, Line : {lineno}, Func.Name : {func_name}, Text : {text}")

在这里插入图片描述
func1() 函数定义并抛出了一个IOError。
func2() 函数调用了func1()。
在try-except块中,我们调用了func2()并捕获了由func1()抛出的异常。
然后我们分别使用了traceback模块的三个函数:print_exc()打印了异常的堆栈跟踪信息到标准错误,format_exc()获取了格式化的异常信息并打印出来,然后我们使用extract_tb()来获取堆栈跟踪信息的详细列表,并逐个打印出了每个堆栈帧的信息。
通过这样的示例,可以看到如何在代码中使用traceback模块来帮助诊断和调试程序异常问题。

✨小结:

traceback 模块提供了强大的 traceback 跟踪功能,可以帮助我们更方便地调试程序和处理异常。除了基本的打印功能之外,它还提供了一些高级用法,例如将 traceback 信息保存到字符串中、定制 traceback 处理器等等,可以帮助我们更加灵活地使用 traceback 模块。

  • 17
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天Aileft

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值