获取异常信息
# 链接资料
- https://docs.python.org/zh-cn/3/tutorial/errors.html
- http://c.biancheng.net/python/try_except/
- https://python3-cookbook.readthedocs.io/zh_CN/latest/chapters/p14_test_debug_and_exceptions.html
在实际调试程序的过程中,有时只获得异常的类型是远远不够的,还需要借助更详细的异常信息才能解决问题。
捕获异常时,有 2 种方式可获得更多的异常信息,分别是:
- 使用 sys 模块中的 exc_info 方法;
- 使用 traceback 模块中的相关函数。
# 获取特定异常的有关信息
通过前面的学习,我们已经可以捕获程序中可能发生的异常,并对其进行处理。但是,由于一个 except 可以同时处理多个异常,那么我们如何知道当前处理的到底是哪种异常呢?
其实,每种异常类型都提供了如下几个属性和方法,通过调用它们,就可以获取当前处理异常类型的相关信息:
- args:返回异常的错误编号和描述字符串;
- str(e):返回异常信息,但不包括异常信息的类型;
- repr(e):返回较全的异常信息,包括异常信息的类型。
# 示例
# 方式一
try:
1 / 0
except Exception as e:
# 访问异常的错误编号和详细信息
print(e.args)
print(str(e))
print(repr(e))
"""
('division by zero',)
division by zero
ZeroDivisionError('division by zero')
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
除此之外,如果想要更加详细的异常信息,可以使用 traceback 模块。有兴趣的读者,可自行查阅资料学习。
从程序中可以看到,由于 except 可能接收多种异常,因此为了操作方便,可以直接给每一个进入到此 except 块的异常,起一个统一的别名 e。
在 Python 2.x 的早期版本中,除了使用 as e 这个格式,还可以将其中的 as 用逗号(,)代替。
# sys.exc_info()
exc_info() 方法会将当前的异常信息以元组的形式返回,该元组中包含 3 个元素,分别为 type、value 和 traceback,它们的含义分别是:
- type:异常类型的名称,它是 BaseException 的子类(有关 Python (opens new window) 异常类,可阅读《Python常见异常类型 (opens new window)》一节)
- value:捕获到的异常实例。
- traceback:是一个 traceback 对象。
# 示例
# 使用 sys 模块之前,需使用 import 引入
import sys
try:
x = int(input("请输入一个被除数:"))
print("30除以", x, "等于", 30 / x)
except:
print(sys.exc_info())
print("其他异常...")
"""
请输入一个被除数:s
(<class 'ValueError'>, ValueError("invalid literal for int() with base 10: 's'"), <traceback object at 0x0000021BE8B305C0>)
其他异常...
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# traceback.print_tb
除了使用 sys.exc_info() 方法获取更多的异常信息之外,还可以使用 traceback 模块,该模块可以用来查看异常的传播轨迹,追踪异常触发的源头。
1
# 示例
# 使用 sys 模块之前,需使用 import 引入
import sys
# 引入traceback模块
import traceback
try:
x = int(input("请输入一个被除数:"))
print("30除以", x, "等于", 30 / x)
except:
# print(sys.exc_info())
traceback.print_tb(sys.exc_info()[2])
print("其他异常...")
"""
其他异常...
File "", line 22, in <module>
x = int(input("请输入一个被除数:"))
"""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1
编辑 (opens new window)
上次更新: 2023/05/17, 23:08:21