Python Exception
Python的异常机制
捕获异常
def fetcher(obj, index):
return obj[index]
obj = 'spam'
fetcher(obj, 2)
fetcher(obj, 10)
函数fetcher用来获取obj对象索引index的值,以上的例子,当索引为2时返回’a’,当索引为10时会出现IndexError异常,导致程序直接退出;
我们修改代码,捕获异常:
def fetcher(obj, index):
try:
return obj[index]
except IndexError:
print('Got index error')
obj = 'spam'
fetcher(obj, 2)
fetcher(obj, 10)
引发异常
使用raise语句引发异常;
比如我要引发一个特定的异常,然后进行捕获异常的测试。
try:
raise TypeError
except TypeError:
print('Got type error')
fetcher('spam', '2') # 这里会引发TypeError的异常
使用assert断言语句引发异常
assert False, 'Nobody expects the Spanish Inquisition' # 当assert的值为负的时候,会触发后面的异常
用户定义的异常
继承Exception异常类,来实现自定义的异常类。
class Bad(Exception):
pass
try:
raise Bad
exception Bad:
print('Got Bad Exception')
Method Resolution Order
Other Exception -> Exception -> BaseException
必定会执行的finally语句
try:
fetch('spam', '2')
finally:
print('always will excute')
异常捕获的意义
控制权在异常发生时就会立刻跳到处理器,没必要让所有代码都去预防错误的发生。再者,因为Python会自动检测错误,所以程序代码通常不需要事先检查错误。重点在于,异常让你大致上可以忽略罕见情况,并避免编写检查错误程序代码。
重点在于,异常让你大致上可以忽略罕见情况。
如果不想在Python引发异常时造成程序终止,只要把程序逻辑包装在try中进行捕捉就行了。这是网络服务器这类程序很重要的功能,因它们必须不断持续运行下去。
空的except子句
空的except子句是一种通用功能,可以捕获任务东西;不过,空except也会引发一些设计的问题,尽管方便,也可能捕获和程序代码无关、意料之外的系统异常,而且可能意外拦截其他处理器的异常。
Python 3.0 引入了一个替代方案来解决这些问题之一——捕获一个名为Exception的异常,几乎与一个空的except具有相同的效果,但是,忽略和系统退出相关的异常。
try:
action()
except:
print('xxx')
try:
action()
except Exception:
print('xxx')
try/else 分句
else子句在没有发生异常时执行;else和finally是可选的,可能会有0个或多个except,但是,如果出现一个else的话,必须有至少一个except。
try:
...run code ...
except IndexError:
...handle exception...
else:
... no exception occurred...
Written on November 1, 2020