- 异常:因为程序出现了错误而在正常控制流以外采取的行为,行为阶段: 触发异常-检测(采取措施)
- 常见异常:
NameError
ZeroDivisionError
SyntaxError IndexError
KeyError
IOError
AttributeError
try-except*-[else]
:一般用法, 若无异常进else
try-finally
:不用来捕获异常, 用来维持一致性的行为(如file.close()
)try-except*-[else]-finally
:无论是否有异常, 最后都会运行finally
配合用法:保证共享的资源的唯一分配, 并在任务结束的时候释放它(如IO、线程资源、数据库连接)- 如果异常发生后没有找到合适的处理器, 则会不断向上移交, 若到顶层仍未找到, 解释器会显示出跟踪记录(
Traceback
)并退出 - 一个
except
子句可以处理多个异常:要求异常被放在一个元祖里 - 非错误条件触发的异常:
SystemExit
(Python应用需要退出)KeyboardInterupt
(用户按了^C) - python2.5起, 异常迁移到新式类(之前是字符串)后的异常基类:
BaseException
, 而且上条两个特殊错误被移至与Exception同级 - 避免把大片的代码装入
try-except
中然后使用pass
忽略掉错误 - 每个异常都会生成自己的异常参数, 异常参数(
Exception, e:
中的e
)自身会组成一个元祖并存储为类实例的属性, 引发异常时最好提供和相应的参数信息 - 如果
finally
中引发了另一个异常或有return
、break
、continue
语法而终止, 原异常将丢失而且无法重新引发 with
(try-except-finally
的抽象化),只能工作于支持上下文管理协议的对象with
和as
间的内容是上下文符号, 用它来获得一个上下文管理器去提供(自身也可以是)一个上下文对象(通过__context__()
方法) 在获得上下文对象后调用__enter__()
来完成with
语句块执行前的准备工作, 若无声明变量丢弃返回值with
语句块执行完无论结果如何都会调用对象的__exit__()
方法(三个参数:等于sys.exc_info()
返回的类型、值、跟踪记录) 用contextlib模块可以更方便使用上下文管理- 字符串做为异常很少使用并且快被废弃,不能用
- 触发异常
raise[ExceptionName(字符串/类/实例)[,args(元祖/单元素元祖),traceback(新的, 便于重新引发异常)]]
当raise
无参数时引发的是当前代码块最近触发的一个异常(如果没有, 会生成TypeError
) - 断言
assert
(相当于raise-if
):如果断言不成功, 触发AssertionError
, 如果没被异常捕捉,将终止程序运行并且提供追踪记录 可在判断后添加异常参数(一般是字符串) - P255标准异常集
BaseException
->SystemExit, KeyboardInterrupt,Exception(包含所有内建异常)
- 另一种获取异常信息的途径是
sys.exc_info()
:提供一个三元组(类,类实例,跟踪记录)
温故知新,高级复读机