## 一,什么是异常
Python使用异常对象来表示异常状态,并在遇到错误时引发异常。异常对象未被处理(或捕获)时,程序将终止并显示一条错误消息(traceback)。
二,引发异常
raise
使用 raise 语句,并将一个类(必须是 Exception 的子类)或实例作为参数。
>>> raise Exception
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Exception
>>> raise Exception('hyperdrive overload')
Traceback (most recent call last):
File "<stdin>", line 1, in ?
Exception: hyperdrive overload
raise Exception——引发通用异常
raise Exception(‘错误信息’) ——添加了错误信息
内置异常类(部分)
类 名 | 描 述 |
---|---|
Exception | 几乎所有的异常类都是从它派生而来的 |
AttributeError | 引用属性或给它赋值失败时引发 |
OSError | 操作系统不能执行指定的任务(如打开文件)时引发,有多个子类 |
IndexError | 使用序列中不存在的索引时引发,为 LookupError 的子类 |
KeyError | 使用映射中不存在的键时引发,为 LookupError 的子类 |
NameError | 找不到名称(变量)时引发 |
SyntaxError | 代码不正确时引发 |
TypeError | 将内置操作或函数用于类型不正确的对象时引发 |
ValueError | 将内置操作或函数用于这样的对象时引发:其类型正确但包含的值不合适 |
ZeroDivisionError | 在除法或求模运算的第二个参数为零时引发 |
自定义异常类
只要是Exception的子类就行
class SomeCustomException(Exception): pass
三,捕获异常
3.1 try/except/else/finally语句
try:
...
except 异常类1:
...
except 异常类2:
...
except(异常类3,异常类4,异常类5):
...
except(异常类6,异常类7) as 储存异常类的变量e:
... #可用该变量e访问该异常类
except: #捕获所有异常
...
else: #没有捕获到异常是
...
finally: #最后执行清理工作,总会运行
...
注意
异常从函数向外传播到调用函数的地方。如果在这里也没有被捕获,异常将向程序的最顶层传播。这意味着你可使用 try / except 来捕获他人所编写函数引发的异常。
3.2重新引发
捕获异常后,如果要重新引发它(即继续向上传播),可调用 raise 且不提供任何参数
注意
发生除零行为时,如果启用了“抑制”功能,方法将(隐式地)返回 None 。换而言之,如果启用了“抑制”功能,就不应依赖返回值。
若在处理异常时想引发其他异常,在except语句raise该异常,但原本的异常将会被作为异常上下文存储起来,并出现在最终的错误消息中。
>>> try:
... 1/0
... except ZeroDivisionError:
... raise ValueError
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
ZeroDivisionError: division by zero
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueError
可使用 raise … from … 语句来提供自己的异常上下文,也可使用 None 来禁用上下文。这样只提供raise与from之间的异常消息。
>>> try:
... 1/0
... except ZeroDivisionError:
... raise ValueError from None
...
Traceback (most recent call last):
File "<stdin>", line 4, in <module>
ValueErro
四,异常和函数
异常和函数有着天然的联系。如果不处理函数中引发的异常,它将向上传播到调用函数的地方。如果在那里也未得到处理,异常将继续传播,直至到达主程序(全局作用域)。如果主程序中也没有异常处理程序,程序将终止并显示栈跟踪消息。
五,异常之禅
六,警告
发出警告,指出情况偏离了正轨,可使用模块 warnings 中的函数 warn 。
同一警告只显示一次。
>>> from warnings import warn
>>> warn('There is a waning')
Warning (from warnings module):
File "__main__", line 1
UserWarning: There is a waning
>>> warn('There is a waning')
>>> warn('There is another warning')
Warning (from warnings module):
File "__main__", line 1
UserWarning: There is another warning
>>>
可用warnings模块中的函数filterwarnings来抑制警告,并指定要采取的措施,如“error”或“ignore”。
即引发异常或忽略。
引发的异常为UserWarnings:警告类
>>> from warnings import filterwarnings
>>> filterwarnings("ignore")
>>> warn("Anyone out there?")
>>> filterwarnings("error")
>>> warn("Something is very wrong!")
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UserWarning: Something is very wrong!