0. 前言
- 参考资料:
1. 内建异常类型
- Python文档:内置异常
1
2
3
4
5
6
7
8
9
10# 内建异常类型
# Exception
# AttributeError
# IOError
# IndexError
# KeyError
# ValueError
# NameError
# SyntaxError
# ZeroDivisionError
2. 新建异常类型
1 | class MyException(Exception): pass |
3. 捕获异常
3.1. 基本使用
try
:运行可能会抛出异常的代码。except
:该关键字有以下多种功能- 捕获一个或多个特定异常
- 捕获其他所有异常
else
:当没有出现异常时执行finally
:不管如何都执行- 其他:
- 抛出的异常只会被一个except捕获。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21def exception_handle():
try:
print("try")
raise ValueError # 抛出特定异常
except IndexError as e:
# 捕获一个异常,并获取异常对象
# 不对异常进行处理,继续抛出异常
raise
except (KeyError, ValueError) as e:
# 捕获某两类异常,并获取异常对象
print(e)
except:
# 捕获除了上述三种异常之外的所有异常
print("except")
raise # 抛出捕获到的异常
else:
# 当没有捕获异常时执行
print("else")
finally:
# 不管是否捕获异常,都要执行
print("finally")
- 抛出的异常只会被一个except捕获。
3.2. 异常类的基类与派生类
即抛出的异常为A,处理异常的类别为B:
- 如果B是A的基类,则A异常会被正常捕获。
- 如果A是B的基类(而不是同一类),A异常不会被捕获。
下面代码的输出结果是
B C D
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except D:
print("D")
except C:
print("C")
except B:
print("B")如果将
except B
放到最前面,则输出的结果为B B B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18class B(Exception):
pass
class C(B):
pass
class D(C):
pass
for cls in [B, C, D]:
try:
raise cls()
except B:
print("B")
except D:
print("D")
except C:
print("C")