Python中的多重异常处理
给定一段代码,它可以抛出几个不同的异常中的任何一个,并且需要考虑所有可能引发的潜在异常,而不会创建重复的代码或冗长、曲折的代码段落。
如果您可以使用单个代码块处理不同的异常,则可以将它们组合在一个元组中,如下面的代码所示:
代码#1:
try:
client_obj.get_url(url)
except (URLError, ValueError, SocketTimeout):
client_obj.remove_url(url)
如果出现任何列出的异常,将调用remove_url()
方法。另一方面,如果必须以不同方式处理其中一个异常,则将其放入自己的 except 子句中,如下面的代码所示:
代码#2:
try:
client_obj.get_url(url)
except (URLError, ValueError):
client_obj.remove_url(url)
except SocketTimeout:
client_obj.handle_url_timeout(url)
许多异常被分组到一个继承层次结构中。对于此类异常,只需指定基类即可捕获所有异常。例如,不要编写如下代码所示的代码 -
代码#3:
try:
f = open(filename)
except (FileNotFoundError, PermissionError):
...
except 语句可以重写,如下面的代码所示。这是因为OSError
是FileNotFoundError
和PermissionError异常通用的基类。
代码#4:
try:
f = open(filename)
except OSError:
...
尽管处理多个异常本身并不是特定的,但值得注意的是,可以使用它们作为关键字来获取抛出异常的句柄,如下面的代码所示。
代码#5:
try:
f = open(filename)
except OSError as e:
if e.errno == errno.ENOENT:
logger.error('File not found')
elif e.errno == errno.EACCES:
logger.error('Permission denied')
else:
logger.error('Unexpected error: % d', e.errno)
e变量保存引发的 OSError 的实例。如果必须进一步投资异常,例如根据附加状态代码的值处理它,这很有用。 except 子句按列出的顺序检查并执行第一个匹配项。
代码 #6:创建多个 except 子句可能匹配的情况
f = open('missing')
输出 :
Traceback (most recent call last):
File "", line 1, in
FileNotFoundError: [Errno 2] No such file or directory: 'miss
try:
f = open('missing')
except OSError:
print('It failed')
except FileNotFoundError:
print('File not found')
输出 :
Failed
此处的 except FileNotFoundError
子句不执行,因为OSError
更一般,匹配 FileNotFoundError 异常,并且被列在最前面。