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('非中国手机号码')