异常对象提供了一个 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异常。运行上面的程序,你会看到如图所示的结果:
从图中可以看出,异常是从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文件,里面也记录了异常传播信息。
本文为原创文章,版权归知行编程网所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ python如何处理mysql获取表头09/16
- ♥ Python中如何使用round方法08/16
- ♥ Python函数的高级用法11/30
- ♥ python如何打印日志11/24
- ♥ python读取excel保存公式无法读取12/05
- ♥ 如何在python中调整包11/05
内容反馈