try…except
我们可以用try…except来处理异常:
try:
import NoThisModule
except ImportError as e:
print e
import os
如果模块不存在,那么Python解释器会报错,模块导入失败的错误一般是 ImportError
所以我们用 except
捕获 ImportError
, 捕获到后,便会执行 except
中的语句。as
是一个关键字,和 import a as b
是一样的,打印出异常的详细解释。
注意:如果 except
后面跟的是其他异常类型,比如:OSError
,但是捕获到的异常类型并不是 OSError
那么except
中的语句就不会执行。
我们可以尝试捕获多个异常:
try:
import os
print os.curdirs
except ImportError as e:
print e
except AttributeError as e:
print e
如果异常的类型是 ImportError
那么执行的是第一个 except
。
如果异常的类型是 AttributeError
那么执行的是第二个 except
。
用 except
捕获异常类型,若其中一个异常类型是基类,和一个继承自该基类的子类,比如:
try:
...
except ChildError:
...
except BaseError:
...
如果 BaseError
定义在 ChildError
之前,那么便会覆盖子类的异常。也就是,只执行 BaseError
,ChildError
发生了也会被基类异常覆盖。
finally
try…except 之后还有一个 finally,不管异常有没有发生,最终都会执行其中的语句:
try:
import NoModule
except ImportError as e:
print e
finally:
import os
try…except…else
异常捕获还可以配合else语法,finally是不管异常有没有发生都会最终执行,else是如果发生异常则不执行,没发生异常才执行。
try:
import os
except:
import sys
else:
print "No EXCEPTIONS occured, so print this!"
自定义异常类型
错误类型其实就是一个继承自 Exception
的模块,比如一些内建的错误类型 OSError
IOError
… 它们都继承自 Exception
,你也可以写一个自己的异常类:
class MyError(Exception):
def __init__(self, explain):
self.explain = explain
def __str__(self):
return "Error Type: %s" % self.explain
raise MyError("error ....")
#######################################
Traceback (most recent call last):
File "/home/zhg/parser/err.py", line 11, in <module>
raise MyError("error ....")
__main__.MyError: Error Type: error ....
raise
用来引发一个异常。