错误和异常的定义
- 广义上的错误分为两种:错误+异常
- Python中,语法正确前提下,运行时产生的错误都是异常
- 异常是一个对象,所以可以处理
异常的分类
- AssertError 断言语句(assert)失败
- AttributeError 尝试访问未知的对象属性
- EOFError 用户输入文件末尾标志EOF(Ctrl+d)
- FloatingPointError 浮点计算错误
- GeneratorExit generator.close()方法被调用的时候
- ImportError 导入模块失败的时候
- IndexError 索引超出序列的范围
- KeyError 字典中查找一个不存在的关键字
- KeyboardInterrupt 用户输入中断键(Ctrl+c)
- MemoryError 内存溢出(可通过删除对象释放内存)
- NameError 尝试访问一个不存在的变量
- NotImplementedError 尚未实现的方法
- OSError 操作系统产生的异常(例如打开一个不存在的文件)
- OverflowError 数值运算超出最大限制
- ReferenceError 弱引用(weak reference)试图访问一个已经被垃圾回收机制回收了的对象
- RuntimeError 一般的运行时错误
- StopIteration 迭代器没有更多的值
- SyntaxError Python的语法错误
- IndentationError 缩进错误
- TabError Tab和空格混合使用
- SystemError Python编译器系统错误
- SystemExit Python编译器进程被关闭
- TypeError 不同类型间的无效操作
- UnboundLocalError 访问一个未初始化的本地变量(NameError的子类)
- UnicodeError Unicode相关的错误(ValueError的子类)
- UnicodeEncodeError Unicode编码时的错误(UnicodeError的子类)
- UnicodeDecodeError Unicode解码时的错误(UnicodeError的子类)
- UnicodeTranslateError Unicode转换时的错误(UnicodeError的子类)
- ValueError 传入无效的参数
- ZeroDivisionError 除数为零
常见案例
下面案例出发下标错误:
#IndexError
list1 = ['冯巩','牛群','马三立','侯宝林']
print(list1[30])#使用了不存在的索引值
---------------------------------------------------------------------------
IndexError Traceback (most recent call last)
<ipython-input-2-66728b44e8d5> in <module>()
1 #IndexError
2 list1 = ['冯巩','牛群','马三立','侯宝林']
----> 3 print(list1[30])#使用了不存在的索引值
4
IndexError: list index out of range
下面案例展示常见错误:
#KeyError
dict1 = {'niu':'穹','zhu':'升','yang':'磊','ma':'星辉'}
print(dict1['lv'])#使用了不存在的键
#nameError
print(diao)#使用了为定义的变量
#ZeroDivisionError
print(99/0)#被除数为0
# KeyboardInterrupt
while True:
print('大爷来玩啊~')
#用于按ctrl+C终止shell执行的错误
# AssertionError
assert len([1,2,3,4]) > 1 #断言成功,不报
assert len([1,2,3,4]) > 10 #断言失败时被报错
异常处理
try:
尝试实现某个操作,
如果没出现异常,任务就可以完成
如果出现异常,将异常从当前代码块扔出去尝试解决异常
except 异常类型1:
解决方案1:用于尝试在此处处理异常解决问题
except 异常类型2:
解决方案2:用于尝试在此处处理异常解决问题
except (异常类型1,异常类型2...)
解决方案:针对多个异常使用相同的处理方式
excpet:
解决方案:所有异常的解决方案
else:
如果没有出现任何异常,将会执行此处代码
finally:
管你有没有异常都要执行的代码
异常执行顺序
- 无任何异常情况下的处理顺序
- 执行try区域内的代码
- 如果没有任何异常发生
- 执行else区域的代码
- 执行finally区域的代码
- 发生异常的处理顺序
- 行try区域内的代码
- 如果出现异常,将异常从当前try区域抛出
- 第一个【except 异常类型1】,会查询抛出的异常是否和我指定的类型一致 如果异常和的类型一致,则进入当前except区域进行处理 如果异常和类型不一致,则跳过当前except区域将异常送到下一个except匹配
- 第二个【except 异常类型2】,会查询抛出的异常是否和我指定的类型一致 如果异常和的类型一致,则进入当前except区域进行处理 如果异常和类型不一致,则跳过当前except区域将异常送到下一个except匹配
5.如果except区域执行完毕或者没有任何except区域能够接受异常对象,继续运行finally区域
用户自定义异常
class 异常类名(RuntimeError):
pass
try:
raise 自定义异常类() #生成并抛出异常类对象
except 异常类 as 接收对象变量:
可以使用接收对象的变量
自定义异常类中成员可以根据需要添加或者不添加
常用的自定义类中的异常属性
自定义发生异常代码
自定义发生异常文字提示
自定义发生异常的行数
等