定义
一般情况下,在程序执行过程中可能会发生一些影响程序正常执行的事件,在Python无法正常处理该事件时就会发生一个异常。
- 异常是Python对象,代表一个执行错误。
- 程序发生异常时需要捕获处理,否则终止执行。
异常类型
以下异常类型引自本文为
- BaseException:所有异常的 基类
- Exception:常规异常的 基类
- StandardError:所有的内建标准异常的基类
- ArithmeticError:所有数值计算异常的基类
- FloatingPointError:浮点计算异常
- OverflowError:数值运算超出最大限制
- ZeroDivisionError:除数为零
- AssertionError:断言语句(assert)失败
- AttributeError:尝试访问未知的对象属性
- EOFError:没有内建输入,到达EOF标记
- EnvironmentError:操作系统异常的基类
- IOError:输入/输出操作失败
- OSError:操作系统产生的异常(例如打开一个不存在的文件)
- WindowsError:系统调用失败
- ImportError:导入模块失败的时候
- KeyboardInterrupt:用户中断执行
- LookupError:无效数据查询的基类
- IndexError:索引超出序列的范围
- KeyError:字典中查找一个不存在的关键字
- MemoryError:内存溢出(可通过删除对象释放内存)
- NameError:尝试访问一个不存在的变量
- UnboundLocalError:访问未初始化的本地变量
- ReferenceError:弱引用试图访问已经垃圾回收了的对象
- RuntimeError:一般的运行时异常
- NotImplementedError:尚未实现的方法
- SyntaxError:语法错误导致的异常
- IndentationError:缩进错误导致的异常
- TabError:Tab和空格混用
- SystemError:一般的解释器系统异常
- TypeError:不同类型间的无效操作
- ValueError:传入无效的参数
- UnicodeError:Unicode相关的异常
- UnicodeDecodeError:Unicode解码时的异常
- UnicodeEncodeError:Unicode编码错误导致的异常
- UnicodeTranslateError:Unicode转换错误导致的异常
异常处理
可以使用try/except语句进行python语言里的异常处理。
- try/except语句可以检测try语句中异常,而让except语句捕获并处理。
- 异常想要被捕获,需要指定捕获的异常类型和发生的异常类型一致。
- 可以为单条异常捕获代码指定多个捕获类型,用‘()’包裹
- 可以增加多条异常捕获代码
- 可以使用Exception承接所有异常
- 可以不指定异常类型(效果同Exception)
- 异常处理支持嵌套
- try/except语法
- try … except
例如:
try:
f = open('123.txt','r')
print(f.read())
except IOError as err:
print(err)
- try语句块试图读取当前目录下的’123.txt’文件,如果读取成功打印文件内容,如果当前目录下没有’123.txt’文件引发‘IOError’异常输出异常原因。
- try … except … else
例如:
try:
f = open('HelloWorld.txt','r')
except IOError as err:
print(err)
else:
print(f.read())
- 效果同上,try语句块试图读取当前目录下的’HelloWorld.txt’文件,如果当前目录下没有’123.txt’文件引发‘IOError’异常输出异常原因,如果没有引发‘IOError’异常则打印文件内容。
- try … except … else … finally
例如:
try:
f = open('HelloWorld.txt','r')
except Exception as err:
print(err)
else:
print(f.read())
finally:
print('Over')
try语句块试图读取当前目录下的'HelloWorld.txt'文件,如果当前目录下没有'123.txt'文件引发‘IOError’异常输出异常原因,如果没有引发‘IOError’异常则打印文件内容,最后无论是否引发异常都要执行finally语句。
**注意:try子块和else子块有承接关系,所以else子块可以使用try子块的局部变量,但except子块和finally子块不能使用try子块的局部变量,如果需要请使用全局变量或申明为全局变量。**
断言异常
Python笔记 之 assert
触发异常
可以使用raise语句自定义触发异常。
Python笔记 之 raise
自定义异常
用户可以通过直接或间接继承标准异常类的方式创建新的异常类。
例如:
class NetworkError(RuntimeError):
def __init__(self,args):
self.args = args
try:
raise NetworkError(('message','网关错误'))
except NetworkError as e:
print(e.args)