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

新手上路,请多包涵

我知道我可以这样做:

 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

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

有没有办法做到这一点?

原文由 inspectorG4dget 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 227
2 个回答

来自 Python 文档

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

except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass

或者,仅适用于 Python 2:

 except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass

用逗号将异常与变量分开在 Python 2.6 和 2.7 中仍然有效,但现在已弃用并且在 Python 3 中不起作用;现在你应该使用 as

原文由 mechanical_meat 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

做这个:

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

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

最佳实践

要以当前和向前兼容 Python 的方式执行此操作,您需要用逗号分隔异常并用括号将它们括起来,以区别于早期语法,后者通过遵循要捕获的异常类型将异常实例分配给变量名逗号。

下面是一个简单用法的例子:

 import sys

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

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

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

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

 import sys

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

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

弃用

您可能会看到用逗号分配错误的代码。这种用法是 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

try , except , pass 行可以用 抑制上下文管理器在一行中处理,在 Python 3.4 中可用

from contextlib import suppress

with suppress(IDontLikeYouException, YouAreBeingMeanException):
     do_something()

所以当你想要 pass 在某些例外情况下,使用 suppress

原文由 Russia Must Remove Putin 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题