一.什么是异常
异常是一个事件,该事件会在程序执行过程中发生,会影响程序的正常运行。一般情况下,python无法正常处理一个异常,会导致程序中断。在出现异常时,为了不影响程序的正常运行,我们需要捕获异常。
在python中异常是一个对象,表示错误。
二.python标准异常
每一个异常都是一个类。
异常名称 | 描述 |
---|---|
BaseException | 所有异常的基类 |
SystemExit | 解释器请求退出 |
KeyboardInterrupt | 用户中断执行(通常是输入^C) |
Exception | 常规错误的基类 |
StopIteration | 迭代器没有更多的值 |
GeneratorExit | 生成器(generator)发生异常来通知退出 |
StandardError | 所有的内建标准异常的基类 |
ArithmeticError | 所有数值计算错误的基类 |
FloatingPointError | 浮点计算错误 |
OverflowError | 数值运算超出最大限制 |
ZeroDivisionError | 除(或取模)零 (所有数据类型) |
AssertionError | 断言语句失败 |
AttributeError | 对象没有这个属性 |
EOFError | 没有内建输入,到达EOF 标记 |
EnvironmentError | 操作系统错误的基类 |
IOError | 输入/输出操作失败 |
OSError | 操作系统错误 |
WindowsError | 系统调用失败 |
ImportError | 导入模块/对象失败 |
LookupError | 无效数据查询的基类 |
IndexError | 序列中没有此索引(index) |
KeyError | 映射中没有这个键 |
MemoryError | 内存溢出错误(对于Python 解释器不是致命的) |
NameError | 未声明/初始化对象 (没有属性) |
UnboundLocalError | 访问未初始化的本地变量 |
ReferenceError | 弱引用(Weak reference)试图访问已经垃圾回收了的对象 |
RuntimeError | 一般的运行时错误 |
NotImplementedError | 尚未实现的方法 |
SyntaxError | Python 语法错误 |
IndentationError | 缩进错误 |
TabError | Tab 和空格混用 |
SystemError | 一般的解释器系统错误 |
TypeError | 对类型无效的操作 |
ValueError | 传入无效的参数 |
UnicodeError | Unicode 相关的错误 |
UnicodeDecodeError | Unicode 解码时的错误 |
UnicodeEncodeError | Unicode 编码时错误 |
UnicodeTranslateError | Unicode 转换时错误 |
Warning | 警告的基类 |
DeprecationWarning | 关于被弃用的特征的警告 |
FutureWarning | 关于构造将来语义会有改变的警告 |
OverflowWarning | 旧的关于自动提升为长整型(long)的警告 |
PendingDeprecationWarning | 关于特性将会被废弃的警告 |
RuntimeWarning | 可疑的运行时行为(runtime behavior)的警告 |
SyntaxWarning | 可疑的语法的警告 |
UserWarning | 用户代码生成的警告 |
三.异常处理
捕获异常可以使用try/except/else语句。
try:
#可能出现异常代码
except <异常名>:
#代码except <异常名> as <异常错误数据>:(在python2中为:except <异常名>, <异常数据>)
#代码else:
#代码
工作原理:
- try后面的语句是可能出现异常的代码,当开始一个try语句,python就在当前程序的上下文中做标记,当出现异常时,就会回到这里。与except的异常名进行匹配,匹配到执行对应代码。如果没有发生异常会执行else(如果有else)后面的语句。
- 当没有匹配的except和else语句时,异常会交给层的try语句,如果外层没有try语句或者也没有匹配的异常,导致程序终止运行。
- except后面不填异常名,表示可以捕获所有的异常。不建议这么写,我们不能通过其识别出具体的异常。
- except后面后可以加多个异常名,使用相同的语句来处理多个异常。
- 注意有else时,不要在异常try/except代码里写返回值,这要会导致else代码不执行。
三.try-finally语句
无论是否发生异常都会执行finally的语句
try:
#可能发生异常的代码
finally:
#代码 退出try时总会执行
有异常:
无异常:
四.触发异常
我们可以使用raise语句自己触发异常
raise Exception(args, traceback)
Exception是异常类型,args是自己提供的异常数据。最后一个参数是可选的,如果存在是跟踪异常对象。
raise Exception()可以理解为是放回一个异常类型为Exception的对象。
五.自定义异常
通过新建一个异常类,程序可以命名他们自己的异常。异常应该是继承自异常类。
except后的参数可以理解为是一个异常类的对象。当匹配到异常,参数被赋值成对应异常类对象。里面包含异常信息。
上面的标准异常只是python自己实现的异常。而我们自定义异常,只是由我们来实现一个异常类。
注意:需要继承异常类。