7.17 异常处理 try... except
什么是异常:异常是错误发生的信号,一旦程序出错,并且程序没有处理这个错误,那就会抛出异常,并且程序的运行随之终止。
-
错误分为两种:
- 语法错误:在程序执行前就要立刻改正过来
- 逻辑错误:
-
对异常处理的方法:
- 错误发生的条件如果是可以预知的,此时应该用if判断去预防异常
- 错误发生的条件如果是不可预知的,此时应该用到异常处理机制:try...except
假设我们有个a.txt文件,我们来读取文件内容:
try:
f = open('a.txt', 'r', encoding='utf-8')
while True:
print(next(f)) # f是迭代器类型,所以可以用next来访问
except StopIteration: # 异常处理,这里指定异常的情况只能处理指定的异常
print('出错啦') # 可以定义异常情况的处理
f.close()
异常处理详解
我们用代码例来说明异常处理的使用方法
-
python的异常信息会包括以下内容:
- 追踪信息
- 异常类型
- 异常value
-
异常的语法:
# 多分支:被检测的代码块抛出的异常有多种可能性,并且需要针对每一种异常类型都定制专门的处理逻辑
# 万能异常:Exception
# else 处理:else内的代码在没有异常的时候执行
# finally 处理:异常处理之后执行,即使发生了想定以外的异常,报错了,也依然会执行
# try...except 只会捕捉第一个发生的异常,并且不会执行try内部异常语句下面的语句
try:
print('---1---')
# name # NameError,所以try内部的代码只能执行到这里
print('---2---')
li = [1,2,3]
# li[100] # IndexError
print('---3---')
# 只能处理 except 指定的异常,其他异常依然会报错
except NameError as e: # 把异常信息传给 e
print('error:', e) # 输出异常信息
# 如果要处理多种,可以再继续添加 except 语句。
except IndexError as e:
print('error:', e)
except Exception as e: # 万能异常,这样可以处理其他异常
print('error:', e)
else: # else内的代码在没有异常的时候执行
print('在没有发生异常的时候处理')
finally: # 异常处理之后执行
print('不管代码有无异常发生,都会执行')
- 主动触发异常:raise 异常类型(值) - 面向对象
class People:
def __init__(self, name, age):
if not isinstance(name, str):
raise TypeError('名字必须是str类型') # 抛出异常
if not isinstance(age, int):
raise TypeError('年龄必须是int类型') # 抛出异常
self.name = name
self.age = age
p1 = People('aaa', 12)
- 断言 assert
info = {}
info['name'] = 'aaa'
info['age'] = 18
# if 'name' not in info:
# raise KeyError('必须有name这个key')
# if 'age' not in info:
# raise KeyError('必须有age这个key')
# python提供断言的功能 assert 。如果不满足条件就会抛出 AssertionError 异常
assert ('name' in info) and ('age' in info) # 这一行就相当于上面的两个if语句
if info['name'] == 'aaa' and info['age'] > 10:
print('Enter')
- 自定义异常类型(类)
python默认带的异常类型都不能满足要求的时候,我们可以自定义异常类型
class MyException(BaseException): # 大部分要沿用python提供的,所以继承BaseException
def __init__(self, msg):
super(MyException, self).__init__()
self.msg = msg # 输入给异常的参数
def __str__(self): # 异常的value 需要用__str__方法来输出
return '<%s>' % self.msg
raise MyException('我自己的异常类型')
- 什么时候用异常处理呢?
- 错误发生条件可以预测
- 错误一定会发生,我无法预知他发生的条件,可是我也必须完成功能

浙公网安备 33010602011771号