Python(二十八)python 获取异常信息

97 阅读3分钟

在实际的开发工作中,我们光知道异常类型是不够的,我们还需要看到更详细的报错信息。

那么,我们应该如何看到报错信息呢?

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 91in 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 错误和异常

 

有好的建议,请在下方输入您的评论。