在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。
那么,我们应该如何看到报错信息呢?
Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块
这是我们第一次使用python的模块
在文件中使用python的模块,需要引入才可以使用。
一:使用 sys 模块中的 exc_info 方法:
1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是:
type:异常类型的名称,python异常类型请参照菜鸟教程《Python 异常处理》
value:捕获到的异常实例。
traceback:是一个 traceback 对象。
2:使用实例
python
复制代码
import sys try: a = input("请输入一个数:") #判断用户输入的是否为数字 if(not a.isdigit()): raise ValueError("a 必须是数字") except ValueError as e: print(sys.exc_info()) print("引发异常:",e)
输出:
请输入一个数:a (<class 'ValueError'>, ValueError('a 必须是数字'), <traceback object at 0x00000209CCC19188>)
引发异常: a 必须是数字
我们通过返回值可以看出,sys.exc_info()返回的是一个元组,第一个值是异常的类型,第二个值是带异常信息,第三个值是一个 traceback 对象,无法直接看出有关异常的信息,还需要对其做进一步处理。
我们来修改一下上边的实例:
python
复制代码
import sys import traceback try: a = int(input("请输入一个数:")) #判断用户输入的是否为数字 print("30除以", a, "等于", 30 / a) except ValueError as e: # print(sys.exc_info()) traceback.print_tb(sys.exc_info()[2]) print("引发异常:",e)
输出:
arduino
复制代码
请输入一个数:0 Traceback (most recent call last): File "F:/camellia/python/testProject/main.py", line 51, in <module> import errorr File "F:\camellia\python\testProject\errorr.py", line 81, in <module> print("30除以", a, "等于", 30 / a) ZeroDivisionError: division by zero
二:使用 traceback 模块中的相关函数:
traceback 模块,可以用来查看异常的传播轨迹,追踪异常触发的源头。
我看到了一个大神用来演示traceback的代码实例:
ruby
复制代码
class SelfException(Exception): pass def mains(): firstMethod() def firstMethod(): secondMethod() def secondMethod(): thirdMethod() def thirdMethod(): raise SelfException("自定义异常信息") mains()
上面程序中 main() 函数调用 firstMethod(),firstMethod() 调用 secondMethod(),secondMethod() 调用 thirdMethod(),thirdMethod() 直接引发一个 SelfException 异常。运行上面程序,将会看到如下所示的结果:
arduino
复制代码
Traceback (most recent call last): File "F:/camellia/python/testProject/main.py", line 51, in <module> import errorr File "F:\camellia\python\testProject\errorr.py", line 99, in <module> mains() File "F:\camellia\python\testProject\errorr.py", line 91, in mains firstMethod() File "F:\camellia\python\testProject\errorr.py", line 93, in firstMethod secondMethod() File "F:\camellia\python\testProject\errorr.py", line 95, in secondMethod thirdMethod() File "F:\camellia\python\testProject\errorr.py", line 97, in thirdMethod raise SelfException("自定义异常信息") errorr.SelfException: 自定义异常信息
从输出结果可以看出,异常从 thirdMethod() 函数开始触发,传到 secondMethod() 函数,再传到 firstMethod() 函数,最后传到 mains() 函数,在 mains() 函数止,这个过程就是整个异常的传播轨迹。
我们可以通过这个轨迹,来追寻整个报错的源头
traceback模块有两个常用方法:
(1):traceback.print_exc():将异常传播轨迹信息输出到控制台或指定文件中。
(2):format_exc():将异常传播轨迹信息转换成字符串。
我们使用traceback.print_exc()来修改一下上边的示例:
scss
复制代码
import traceback class SelfException(Exception): pass def mains(): firstMethod() def firstMethod(): secondMethod() def secondMethod(): thirdMethod() def thirdMethod(): raise SelfException("自定义异常信息") try: mains() except: # 捕捉异常,并将异常传播信息输出控制台 traceback.print_exc() # 捕捉异常,并将异常传播信息输出指定文件中(log.txt在当前代码运行目录中) traceback.print_exc(file=open('log.txt', 'a'))
更多应用,请参照《Python3 错误和异常》
有好的建议,请在下方输入您的评论。