异常类型
python标准异常
异常名称 |
描述 |
BaseException |
所有异常的基类 |
SystemExit |
解释器请求退出 |
KeyboardInterrupt |
用户中断执行(通常是输入ctro+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 |
用户代码生成的警告 |
FileNotFoundError |
未发现文件错误,要读的文件不存在 |
在python2中,要读的文件不存在时,会报IOError异常;而在python3中,如果要读的文件不存在,则会报FileNotFoundError异常。
异常处理
try...except...:
1.在try语句中捕获异常,在except语句中处理异常。当try所包含的语句中没有异常时,程序正常执行,except语句被忽略,不再执行;当try语句中捕获到了异常时,try语句从异常出现的位置都不再执行,而是执行except语句进行异常处理。
2.except语句后面可以跟一个具体的异常类型,表示此条except语句专门用来处理此种类型的异常;也可以没有任何异常类型,表示此条except语句可以处理任何类型的异常。
3.try后还可以有多个except语句,每个except语句都可以用来处理某一类的异常,当try捕获到了某个异常时,就会跳到相应的except语句中进行异常的处理。此外,还可以在一个except语句后面放多个异常参数,多个异常参数必须以元组的形式放入,表示这几个异常由某一个except语句作统一的处理。
4.可以在except的异常参数后加上as语句,用来将系统提示的异常原因打印出来。
5.如果except语句中对异常处理的要求不严格,不需要具体的处理某一类的异常,可以直接使用except或者except Exception, e或者except Exception as e来捕获所有类型的异常,因为as后的变量e指向了异常对象的引用。
raise关键字用来抛出自定义的异常,即raise关键字后面可以跟自定义的异常。当只使用raise关键字时,而没有自定义异常,它会将当前位置发生的异常向上抛出,抛到上一级位置。同样的,如果没有raise,发生异常时,异常也会从当前位置一级一级地向上抛出,知道异常被捕获或者被系统处理。
def test1():
print('......1.....')
print(num) # 此处有异常,打印了一个未申明的变量
def test2():
print('......2.....')
test1() # test2函数里调用test1函数
def test3():
try: # test3函数中有异常处理机制
print('......3.....')
test2() # test3函数里调用test2函数
except:
print('there has a error.')
test3()
macdeMBP:~ mac$ python3 a.py # 执行文件
......3.....
......2.....
......1.....
there has a error. # test3中作的异常处理
以上代码中,当执行test3函数时,test3函数中调用了test2函数,test2函数中又调用了test1函数,test1函数发生异常,而test1函数中又没有异常处理机制,此时会将异常上抛给test2函数,test2函数中也没有异常处理机制,则会将异常继续上抛给test3函数,test3函数中会捕获异常并进行处理。若test3函数中也没有异常处理,则会继续上抛给python解析器,由python解析器进行处理并中断程序。
else子句:
在异常处理中,else子句是放在except子句之后。如果try语句中没有捕获到异常,即程序正常的执行完毕,except被忽略,此时else子句会执行;如果try语句中发生异常,except被执行,此时else子句不会被执行。简言之,发生了异常,else不执行;没有发生异常,else语句执行。
finally子句:
finally子句放在最后,不管前面执行了try还是except,最终都要执行finally子句,它可用来作最后的善后工作,比如可在finally中关闭文件等操作。
异常处理的格式综合为:
try:
pass
except:
pass
else:
pass
finally:
pass
用户自定义异常
通过自定义一个新的异常类,程序可以命名它们自己的异常。异常应该是典型的通过直接或间接的方式继承Exception类。以下为与RuntimeError相关的实例,实例中创建了一个类,基类为RuntimeError,用于在异常触发时输出更多的信息。在try语句块中,用户自定义的异常后执行except块语句,变量 e 指向了Networkerror类的实例的引用。
class NetworkError(RuntimeError): # 直接或间接的方式继承Exception类
def __init__(self, arg):
self.args = arg
在定义以上类后,可以触发该异常,如下所示:
try:
raise NetworkError("Bad hostname") # 抛出自定义的异常类,可在except中处理
except NetworkError as e: # 变量e指向了Networkerror异常类实例的引用
print e.args # 通过实例打印异常类中的属性
assert
Python的断言就是检测一个条件,如果条件为真,它什么都不做;反之它触发一个带可选错误信息的AssertionError。通常用来断言某个变量的值必然是什么,或者对象必然拥有某个属性。
使用assert的最佳时机:
防御性编程;
运行时对程序逻辑的检测;
合约性检查(比如前置条件、后置条件);
程序中的常量;
检查文档。