知行编程网知行编程网  2022-11-17 19:30 知行编程网 隐藏边栏  9 
文章评分 0 次,平均分 0.0
导语: 本文主要介绍了关于Python traceback模块:获取异常信息的相关知识,包括特斯拉刹车失灵事件真相大白,以及微擎模块兼容其他框架这些编程知识,希望对大家有参考作用。

Python traceback 模块:获取异常信息

异常对象提供了一个 with_traceback 用于处理异常的传播轨迹。查看异常的传播轨迹可以跟踪异常触发的来源,也可以一路看到异常触发的轨迹。

下面示例显示了如何显示异常传播轨迹:

class SelfException(Exception): pass

def main():
    firstMethod()
def firstMethod():
    secondMethod()
def secondMethod():
    thirdMethod()
def thirdMethod():
    raise SelfException("自定义异常信息")
main()

上述程序中main()函数调用firstMethod(),firstMethod()调用secondMethod(),secondMethod()调用thirdMethod(),thirdMethod()直接抛出SelfException异常。运行上面的程序,你会看到如图所示的结果:

Python traceback 模块:获取异常信息

从图中可以看出,异常是从thirdMethod()函数触发的,传给secondMethod()函数,再传给firstMethod()函数,最后传给main()函数。在 main() 函数结束时,这个过程就是 Python 异常传播轨迹。

在实际应用程序的开发中,最复杂的操作被分解为一系列函数或方法调用。这是因为,为了更好的可重用性,每个可重用的代码单元都被定义为一个函数或方法,逐渐将复杂的任务分解为更小、更易于管理的子任务。由于一个大型的业务功能需要通过多个函数或方法来实现,所以在最终的编程模型中,很多对象会通过一系列函数或方法调用进行通信和执行任务。

因此,在应用程序运行时,经常会发生一系列函数或方法调用,从而导致“函数调用大战”。异常的传播则相反。只要异常没有被完全捕获(包括异常没有被捕获,或者异常被处理并重新引发新的异常),异常就会逐渐从发生异常的函数或方法向外传播,先到功能。或者方法的调用者,函数或方法的调用者传递给它的调用者,直到最终传递给Python解释器,此时Python解释器会中止程序并打印异常传播轨迹信息。

很多初学者看到图1所示的异常信息就慌了,认为程序有很多严重的错误。事实上,只有一个错误。系统提示了这么多行信息,但只显示异常是按顺序触发的。弹道。

实际上,图中显示的异常传播轨迹信息非常清晰,它记录了应用程序中执行停止的各个点。最后一行信息详细说明了异常的类型和异常的详细消息。从这一行往上依次记录异常的来源和异常传播的轨迹,并指出异常发生的文件、行、函数。

Python 专门提供了 traceback 模块来处理异常传播轨迹。使用 traceback 可以轻松处理 Python 的异常传播轨迹。导入 traceback 模块后,traceback 提供了以下两种常用方法:

traceback.print_exc():将异常传播跟踪信息输出到控制台或指定文件。

format_exc():将异常传播轨迹信息转换成字符串。

有的读者可能会好奇,从以上这些方法中,根本看不出他们处理了哪些异常传播轨迹信息。其实常用的print_exc()就是省略limit和file两个参数的print_exc([limit[, file]])的形式。 print_exc([limit[, file]]) 的完整形式是 print_exception(etype, value, tb[,limit[, file]])。在完整的表单中,前三个参数用于指定有关异常的以下信息:

etype:指定异常类型;

value:指定异常值;

tb:指定异常的traceback 信息;

当程序在except块中时,可以通过sys对象获取except块捕获的异常信息,其中sys.exc_type、sys.exc_value、sys.exc_traceback分别代表当前的异常类型、异常值和异常传播除了块轨迹。

简单来说, print_exc([limit[, file]]) 相当于如下形式:

print_exception(sys.exc_etype, sys.exc_value, sys.exc_tb[, limit[, file]])

也就是说,使用 print_exc([limit[, file]]) 将自动处理当前 except 块捕获的异常。该方法还涉及两个参数:

limit:用于限制显示异常传播的层数。例如,函数A调用函数B,函数B发生异常。如果指定limit=1,则只显示函数A发生的异常。如果未设置limit参数,则默认全部显示。

file:指定将异常传播轨迹信息输出到指定文件。如果未指定此参数,则默认输出到控制台。

在 traceback 模块的帮助下,我们可以使用 except 块来捕获异常并在那里打印异常传播信息,包括将其输出到文件中。例如下面的程序:

# 导入trackback模块
import traceback
class SelfException(Exception): pass

def main():
    firstMethod()
def firstMethod():
    secondMethod()
def secondMethod():
    thirdMethod()
def thirdMethod():
    raise SelfException("自定义异常信息")
try:
    main()
except:
    # 捕捉异常,并将异常传播信息输出控制台
    traceback.print_exc()
    # 捕捉异常,并将异常传播信息输出指定文件中
    traceback.print_exc(file=open('log.txt', 'a'))

上述程序的第一行首先导入了traceback模块。接下来程序使用except来捕获程序的异常,并使用traceback的print_exc()方法输出异常传播信息,分别输出到控制台和指定文件。

运行上面的程序,还可以看到控制台输出了异常传播信息,程序目录下生成了一个log.txt文件,里面也记录了异常传播信息。

本文为原创文章,版权归所有,欢迎分享本文,转载请保留出处!

知行编程网
知行编程网 关注:1    粉丝:1
这个人很懒,什么都没写
扫一扫二维码分享