📜  Python中的多重异常处理

📅  最后修改于: 2022-05-13 01:55:40.309000             🧑  作者: Mango

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 语句可以重写,如下面的代码所示。这是因为OSErrorFileNotFoundErrorPermissionError异常通用的基类。

代码#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 异常,并且被列在最前面。