Python traceback模块:获取异常信息

提供了一个异常对象 with_traceback 用于处理异常传播轨迹,检查异常传播轨迹可以跟踪异常触发源,也可以看到异常触发的轨迹。
以下示例显示了如何显示异常传播轨迹:
classSelfException(Exception):pass
defmain():
firstMethod()
deffirstMethod():
secondMethod()
defsecondMethod():
thirdMethod()
defthirdMethod():
raiseSelfException("定制异常信息")
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() 是 print_exc([limit[, file]]) 省略了 limit、file 以两个参数的形式。和 print_exc([limit[, file]]) 的完整形式是 print_exception(etype, value, tb[,limit[, file]]),前三个参数用于指定完整形式中的异常信息:
etype:指定异常类型;
value:指定异常值;
tb:traceback指定异常 信息;
当程序处于 except 块中时,该 except 块捕获的异常信息可以通过 sys 对象来获取,其中 sys.exc_type、sys.exc_value、sys.exc_traceback 就代表当前 except 块内的异常类型、异常值和异常传播轨迹。
简单来说, 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=只显示函数 A 异常发生在里面。如果没有设置 limit 默认显示所有参数。
file:在指定文件中输出异常传播轨迹信息。如未指定该参数,则默认输出到控制台。
借助于 traceback 我们可以使用模块的帮助 except 块捕获异常,并打印异常传输信息,包括将其输出到文件中。例如,以下程序:
#导入trackback模块
importtraceback
classSelfException(Exception):pass
defmain():
firstMethod()
deffirstMethod():
secondMethod()
defsecondMethod():
thirdMethod()
defthirdMethod():
raiseSelfException("定制异常信息")
try:
main()
except:
#捕捉异常,异常传输信息输出控制台
traceback.print_exc()
#捕获异常,并在指定文件中输出异常传输信息
traceback.print_exc(file=open('log.txt','a'))上述程序的第一行先导入 traceback 下一个程序使用模块 except 使用捕获程序的异常 traceback 的 print_exc() 将异常传输信息输出到控制台和指定文件中。
在操作上述程序时,您还可以在控制台上输出异常传输信息,并在程序目录下生成一个 log.txt 异常传输信息也记录在文件中。
