一:常见异常与错误
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 语法错误
IndentationError 缩进错误
TabError Tab 和空格混用
SystemError 一般的解释器系统错误
TypeError 对类型无效的操作
ValueError 传入无效的参数
UnicodeError Unicode相关的错误
UnicodeDecodeError Unicode解码时的错误
UnicodeEncodeError Unicode编码时错误
UnicodeTranslateError Unicode转换时错误
二:try..except语句处理异常
需要注意的是,静态异常是不能捕捉处理的,必须在编码阶段修正,程序才能正常编译。
对于程序运行过程中的异常,才可以用try...except语句捕捉并处理,使程序可以继续执行下去直到正常退出。
try:
语句块
except 异常类型,e:
处理异常
异常类型必须对应语句块中可能出现的异常,否则捕捉失败;
异常捕捉会捕捉自身类型以及其子类型的异常;
多个except语句顺序捕捉,当某一层捕捉了所有异常时,后面的不执行。所以,except语句块的安排必须合理,如果把BaseException放第一,则会导致下面的其他except语句块永远捕捉不到。
三:try...except...else语句
try:
语句块
except 异常类型,e:
异常处理语句
else:
如果没有捕捉到异常,则执行else的语句
四:try...finally语句
try:
语句块
finally:
try语句块抛出异常后,先执行finally语句进行一些扫尾工作,然后把异常抛出给python解析器
(无论try语句块有无异常,finally语句都会执行,并且一般用于释放资源、关闭流、关闭文件等)
五:try...except...else...finally语句
try:
语句块
except 异常类型,e:
异常处理语句
else:
如果没有捕捉到错误,执行else语句
finally:
最终必须执行的语句,释放系统资源、关闭IO流
六:with...as语句
with...as语句是用来简化try...except...finally语句块的,其实就是把finally语句块里的释放、关闭操作交给了上下文管理器去执行。with...as语句是不进行异常处理的,如果with语句出错,则会抛出异常,所以需要在外层加一个try...except语句处理异常。
完整的使用如下:
try:
with 执行语句 as result:
对result的信息提取、处理
except 异常类型,e:
异常处理
原理:with所求值的对象必须有一个__enter__()方法,一个__exit__()方法。紧跟with后面的语句被求值后,返回对象的__enter__()方法被调用,这个方法的返回值将被赋值给as后面的变量。当with后面的代码块全部被执行完之后,将调用前面返回对象的__exit__()方法。
如果期间出现异常,会先执行__exit__(),再抛出异常。
在我们自定义类时,一个__enter__()方法,一个__exit__()方法。并且把清理资源,关闭文件等等操作放在__exit__方法当中,甚至可以在exit方法中打印异常信息。
之后我们在with语句使用该自定义的类对象时,就会自动调用exit方法进行资源释放。
七:异常的抛出
raise 异常类型,“异常提示信息”
八:断言
assert 表达式,"错误提示信息"
代码执行到断言时,会检测 表达式语句 是否为真,是则继续执行;若为false,则抛出AssertionError并且打印后面的“错误提示信息”。
可以在编码时,在某些需要验证、严格控制的地方,使用断言。然后在调用函数处捕捉异常。
也可以用于某些关键位置的代码调试。
九:标准异常与自定义异常
标准异常:Python内建的异常,可以用程序运行期间触发,然后被捕捉处理。
自定义异常:可以自定义一些异常,然后在代码中针对某些情况用raise语句抛出,然后在上层捕捉处理。
自定义异常类必须继承Exception类或其子类。
class MyException(Exception)://自定义异常类
def __init__(self,info)://构造函数,传进来一个异常提示信息
self.info=info
def __str__(self)://tostring函数,用于打印异常
return self.info raise MyException("错误信息")//手动抛出异常 try:
语句块
except MyException,e:
print e //打印异常