在一行中捕获多个异常(except块)

23 浏览
0 Comments

在一行中捕获多个异常(except块)

我知道我可以这样做:

try:
    # do something that may fail
except:
    # do this if ANYTHING goes wrong

我还可以这样做:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreTooShortException:
    # stand on a ladder

但是如果我想在两个不同的异常中执行相同的操作,目前我能想到的最好方法是这样做:

try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please

有没有办法像这样做(因为在两种异常中采取的操作是“说请”):

try:
    # do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
    # say please

现在这不会奏效,因为它符合以下语法的语法:

try:
    # do something that may fail
except Exception, e:
    # say please

因此,我为捕获这两个不同的异常所做的努力并没有完全实现。

有没有办法做到这一点?

admin 更改状态以发布 2023年5月21日
0
0 Comments

如何在一个except块中捕获多个异常?

可以这样做:

try:
    may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
    handle(error) # might log or have some other default behavior...

由于旧的语法使用逗号将错误对象分配给名称,因此需要括号。使用as关键字进行分配。您可以为错误对象使用任何名称,但我个人更喜欢error

最佳实践

为了以一种当前和向前兼容的方式进行此操作,您需要使用逗号将异常分开,并用括号包装它们,以区分早期的语法,该语法通过在要捕获的异常类型后跟逗号来分配异常实例给变量名称。

以下是一个简单使用示例:

import sys
try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
    sys.exit(0)

我只指定了这些异常以避免隐藏错误,如果我遇到错误,我希望从中获得完整的堆栈跟踪。

此处有文档: https://docs.python.org/tutorial/errors.html

您可以将异常分配给一个变量(e是常见的,但如果您具有较长的异常处理或您的IDE仅突出显示大于该选项的选项,则可以更喜欢更详细的变量,就像我的IDE一样。)实例具有args属性。以下是一个示例:

import sys
try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    sys.exit(0)

请注意,在Python 3中,err对象在except块结束时会超出范围。

已过时

您可能会看到使用逗号分配错误的代码。这种用法是Python 2.5及更早版本中唯一可用的形式,已弃用,如果您希望您的代码在Python 3中保持向前兼容性,则应更新语法以使用新形式:

import sys
try:
    mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
    print err
    print err.args
    sys.exit(0)

如果您在代码库中看到了逗号名称赋值,并且您正在使用Python 2.5或更高版本,请切换到新的执行方式,以使您的代码在升级时保持兼容性。

suppress上下文管理器

接受的答案实际上是最少的4行代码:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

suppress上下文管理器可在Python 3.4中使用:tryexcept,和pass行可以在单行中处理。

from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

因此,当您想要pass某些异常时,请使用suppress

0
0 Comments

来自Python文档

一个except子句可以将多个异常命名为一个带括号的元组,例如

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

或者,仅适用于Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

在Python 2.6和2.7中,使用逗号将异常与变量分离仍然可以工作,但现在已过时并且在Python 3中不起作用;现在应该使用as

0