今天学习了异常处理。
什么是异常?
异常是错误发生前的一种信号
如果没有人来处理这个信号 程序就会中断执行并抛出错误信息
异常的分类:
1.语法检查异常 这种异常是最低级异常 绝对不应该犯
也非常好避免 如果是编辑器 会自动提示
如果是文本编辑器 在你运行代码前 解释器会检查语法
2.运行时异常(逻辑异常)
这种异常只有在代码被执行时才能发现
我们要处理的重点就是运行时异常
特点:在没有运行代码前 是无法发现的
如果运行时异常已经发生并且没有正确处理它 就抛出错误信息
并且中断程序的执行 这是要我们学习异常解决的问题
异常的组成
1.追踪信息 (具体发生异常的位置 以及函数的调用顺序)
2.异常的类型 (错误的类型)
3.异常的消息 (详细的错误消息)
我们之所以学习异常处理
为的是让我们的程序更加稳定 (健壮性) 不容易崩溃
常见的发生原因:
NameError 找不到这个名字 要么变量 要么函数
ValueError 在调用一个函数时给的值不正确
TypeError 类型错误 例如字符串与数字加减乘除 调用一个不能被调用的类型
ZeroDivisionError 除数不能为0
KeyError 没有这个key
IndexError 索引不存在
StopIteration 没有更过的值可以迭代
FileNotFoundError 文件不存在
io.UnsupportedOperation 文件的操作不支持
AttributeError 没有这个属性
KeyboardInterrupt 程序被强行终止 ctrl + c
要处理异常
要学的就是一个新的语法
今后使用最多的写法:
try:
这里放可能出现异常的代码
except: 异常的类型:
当异常发生并且异常类型匹配时
执行except中的代码
注意:一旦try中有代码抛出了异常 后面的代码全都不执行
例子:
print('staring...')
try:
name
[][-1]
9/0
except NameError:
print('名字找不到!')
except IndexError:
print('索引超出范围')
except ZeroDivisionError:
print('除数不能为0')
print('ending...')
结果为:staring...
名字找不到!
ending...
finally 用法
无论是否发生异常 都会执行finally 可以用来回收系统资源!
例子:
try:
f = open('a.txt','rt',encoding = 'utf-8')
f.read()
f.write('123')
except Exception:
print('发生异常了')
finally:
print('关闭文件!')
f.close()
print(f.closed)
结果为:发生异常了!
关闭文件!
True #代表文件真的关闭了~
当程序中有一些限制 然而用户没有遵守 我们可以主动抛出异常
语法:
raise 异常类型(异常的详细信息)
类型必须是BaseException的子类
例子:
age = input('请输入整型的年龄:')
if not age.isdigit():
raise TypeError('你输入的不是整型!')
age = int(age)
print('十年后你%s岁'%(age +10))
断言 可以理解为断定 就是很清楚 很明确
什么时候需要断定?
下面的代码必须依赖上面代码的正确数据
语法:assert 结果为Bool的表达式
如果值为True 则继续往下执行
为False 抛出一个 AssertionError 表示断言失败
没有assert 也可以使用if来玩 assert 仅仅是简化了代码
例子:
li = []
assert len(li) >0
print(li[0])
自定义异常类型
当系统提供的这些异常类型 和你要描述的错误不匹配时 就需要自定义异常类型
写法:
class 自定义异常类型名称(BaseException):
总结一下:之所以自定义异常类型 是为了更具体描述你的错误 让使用者一眼就看出来
关键点:1.如何自定义异常类型
2.在except中 使用as 来获取异常对象
例子:
class UnlikeError:
def __init__(self,msg,text):
self.msg = msg
self.text = text
def hello():
test = input('输入一段话:')
if test == '你真帅':
print('你说得对!')
else:
raise UnlikeError('你再看看...','另一份参数')
try:
hello()
except UnlikeError as e:
print(e.text)