十四、异常机制

一、异常对象

Python 标准库中 有很多异常类,都是继承自 标准库里面的 Exception 类

1
2
3
4
5
6
7
a = 100/0
print(a)

Traceback (most recent call last):
File "xxxxxxxxxx.py", line 1, in <module>
a = 100/0
ZeroDivisionError: division by zero

二、 捕获异常

try … except …

try ... except ...方法可以用来 捕获 和 处理异常

1
2
3
4
5
6
7
while True:
try:
miles = input('请输入英里数:')
km = int(miles) * 1.609344
print(f'等于{km}公里')
except ValueError:
print('你输入了非数字字符')
  • try :缩进的3行代码可以看做 保护区 中的代码。
  • except :如果 保护区 中的代码发生异常,程序不会中止,会继续执行。
    • except 后面缩进的代码 就是对 这种类型错误的 一种处理。

如果某段代码中可能出现好几种异常,可以使用多个 except 代码段,分别捕获多种类型的异常。

1
2
3
4
5
6
7
8
9
10
try:
choice = input('输入你的选择:')
if choice == '1':
100/0
elif choice == '2':
[][2]
except ZeroDivisionError:
print ('出现 ZeroDivisionError')
except IndexError :
print ('出现 IndexError')

三、 获取异常对象

使用 except 语句匹配异常类型的时候,可以使用 as 关键字,后面加变量名称,这用可以把产生异常的对象赋值给变量。

1
2
3
4
try:
100/0
except ZeroDivisionError as e:
print (f'异常对象信息:{e}')

执行结果:

1
异常对象信息:division by zero

四、 匹配所有异常

当我们不知道代码会抛出什么类型的异常时,可以匹配 所有类型 的异常。

1
2
3
4
try:
100/0
except Exception as e:
print('未知异常:', e)

还有一种更简洁的写法:

1
2
3
4
try:
100/0
except:
print('未知异常:')

traceback 模块 中的 format_exc 函数 可以更详细的显示异常信息。

1
2
3
4
5
6
import traceback

try:
100/0
except :
print(traceback.format_exc())

执行结果:

1
2
3
4
Traceback (most recent call last):
File "xxxx/xxx.py", line 4, in <module>
100/0
ZeroDivisionError: division by zero

五、 自定义异常

自定义 异常类型,通过 raise 关键字来抛出对应的 自定义异常

自定义异常:

1
2
3
4
5
6
7
# 异常对象,代表电话号码有非法字符
class InvalidCharError(Exception):
pass

# 异常对象,代表电话号码非中国号码
class NotChinaTelError(Exception):
pass

异常调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def  register():
tel = input('请注册您的电话号码:')

# 如果有非数字字符
if not tel.isdigit():
raise InvalidCharError()

# 如果不是以86开头,则不是中国号码
if not tel.startswith('86'):
raise NotChinaTelError()

return tel

try:
ret = register()
except InvalidCharError:
print('电话号码中有错误的字符')
except NotChinaTelError:
print('非中国手机号码')