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

我知道我可以这样做:

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

有什么办法可以做这样的事情吗(因为在这两个例外中采取的行动是say please ):

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

现在,这真的不起作用,因为它符合以下语法:

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

所以,我努力去捕捉这两个明显的例外并不完全一样。

有没有办法做到这一点?


来自Python文档:

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

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

或者,仅适用于Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

用逗号分隔变量的异常仍然可以在Python 2.6和2.7中使用,但现在已经被弃用,并且在Python 3中不起作用; 现在你应该使用as


如何在一行中捕获多个异常(块除外)

做这个:

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

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

最佳实践

为了以与Python兼容的方式进行操作,需要用逗号分隔异常,并用圆括号将它们包装起来,以区别于将异常实例分配给变量名称的早期语法,方法是按照异常类型来捕获逗号。

这是一个简单的使用的例子:我目前正在包装的main在我的交互式命令行PythonTrainer程序与一个KeyboardInterrupt和引发EOFError一抓,使用户可以留下一个交互式键盘输入会话半优雅地用Ctrl + d或Ctrl + C:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary for Python 3
    quit(0)

我只指定了这些例外以避免隐藏错误,如果遇到我期望的完整堆栈跟踪。

这是在这里记录:https://docs.python.org/tutorial/errors.html

您可以将异常分配给变量( e很常见,但如果您有很长时间的异常处理,或者您的IDE只会突出显示比这更大的选择,那么您可能更喜欢更详细的变量)。该实例具有args属性。 这里是一个例子:

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    quit(0)

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

弃用

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

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

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

suppress上下文管理器

被接受的答案实际上是4行代码,最小值为:

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

except pass线excepttry可以用Python 3.4中的suppress context manager来处理:

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

所以当你想pass某些异常时,使用suppress


对于Python 2.5及更早版本,正确的语法是:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    print e

其中e是Exception实例。

链接地址: http://www.djcxy.com/p/4399.html

上一篇: Catch multiple exceptions in one line (except block)

下一篇: Why "else"?