每个异常都是某个类的实例。
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Exception: hyperdrive overload
Exception | 几乎所有的异常类都是从它派生而来的 |
AttributeError | 引用属性或给它赋值失败时引发 |
OSError | 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类 |
IndexError | 使用序列中不存在的索引时引发,为 |
KeyError | 使用映射中不存在的键时引发,为 LookupError 的子类 |
NameError | 找不到名称(变量)时引发 |
SyntaxError | 代码不正确时引发 |
TypeError | 将内置操作或函数用于类型不正确的对象时引发 |
ValueError | 将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适 |
ZeroDivisionError | 在除法或求模运算的第二个参数为零时引发 |
自定义异常
何创建异常类呢?就像创建其他类一样,但务必直接或间接地继承 Exception
捕获异常
捕获异常后,如果要重新引发它(即继续向上传播),可调用 raise
且不提供任何参数. 在 except
子句中使用不带参数的 raise
通常是不错的选择
要使用一个 except
子句捕获多种异常,可在一个元组中指定这些异常
finally
子句,可用于在发生异常时执行清理工作。
检查对象是否包含特定的属性时, try / except
也很有用
不呢么异常
如果你只想发出警告,指出情况偏离了正轨,可使用模块 warnings
中的函数 warn
。
>>> from warnings import warn
>>> warn("I've got a bad feeling about this.")
__main__:1: UserWarning: I've got a bad feeling about this.
>>>
#警告只显示一次。如果再次运行最后一行代码,什么事情都不会发生。