14.异常机制
大约 2 分钟学习笔记Python基础
一、异常对象
Python
标准库中 有很多异常类,都是继承自 标准库里面的 Exception 类
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 ...
方法可以用来 捕获 和 处理异常
while True:
try:
miles = input('请输入英里数:')
km = int(miles) * 1.609344
print(f'等于{km}公里')
except ValueError:
print('你输入了非数字字符')
try
:缩进的 3 行代码可以看做 保护区 中的代码。except
:如果 保护区 中的代码发生异常,程序不会中止,会继续执行。except
后面缩进的代码 就是对 这种类型错误的 一种处理。
如果某段代码中可能出现好几种异常,可以使用多个 except
代码段,分别捕获多种类型的异常。
try:
choice = input('输入你的选择:')
if choice == '1':
100/0
elif choice == '2':
[][2]
except ZeroDivisionError:
print ('出现 ZeroDivisionError')
except IndexError :
print ('出现 IndexError')
三、 获取异常对象
使用 except
语句匹配异常类型的时候,可以使用 as
关键字,后面加变量名称,这用可以把产生异常的对象赋值给变量。
try:
100/0
except ZeroDivisionError as e:
print (f'异常对象信息:{e}')
执行结果:
异常对象信息:division by zero
四、 匹配所有异常
当我们不知道代码会抛出什么类型的异常时,可以匹配 所有类型 的异常。
try:
100/0
except Exception as e:
print('未知异常:', e)
还有一种更简洁的写法:
try:
100/0
except:
print('未知异常:')
traceback
模块 中的 format_exc
函数 可以更详细的显示异常信息。
import traceback
try:
100/0
except :
print(traceback.format_exc())
执行结果:
Traceback (most recent call last):
File "xxxx/xxx.py", line 4, in <module>
100/0
ZeroDivisionError: division by zero
五、 自定义异常
自定义 异常类型,通过 raise
关键字来抛出对应的 自定义异常
自定义异常:
# 异常对象,代表电话号码有非法字符
class InvalidCharError(Exception):
pass
# 异常对象,代表电话号码非中国号码
class NotChinaTelError(Exception):
pass
异常调用:
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('非中国手机号码')