在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。
那么,我们应该如何看到报错信息呢?
Python中为我们提供了两个可以查看标错信息的库,sys 模块中的 exc_info,traceback 模块
这是我们第一次使用python的模块
在文件中使用python的模块,需要引入才可以使用。
一:使用 sys 模块中的 exc_info 方法:
1:exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是:
type:异常类型的名称,python异常类型请参照菜鸟教程《Python 异常处理》
value:捕获到的异常实例。
traceback:是一个 traceback 对象。
2:使用实例
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 对象,无法直接看出有关异常的信息,还需要对其做进一步处理。
我们来修改一下上边的实例:
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)
输出:
请输入一个数: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的代码实例:
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 异常。运行上面程序,将会看到如下所示的结果:
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()来修改一下上边的示例:
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 错误和异常》
有好的建议,请在下方输入您的评论。