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

Python 在一行中捕获多个异常(块除外),python,exception,exception-handling,Python,Exception,Exception Handling,我知道我能做到: 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:

我知道我能做到:

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:
    # say please
except YouAreTooShortException:
    # stand on a ladder
try:
    # do something that may fail
except IDontLikeYouException:
    # say please
except YouAreBeingMeanException:
    # say please
有什么方法可以这样做吗(因为在这两种例外情况下都要执行的操作是
说please
):

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

try:
    # do something that may fail
except Exception, e:
    # say please
因此,我捕获这两个截然不同的异常的努力并没有完全实现

有办法做到这一点吗?

来自:

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

或者,仅适用于Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass
用逗号将异常与变量分开在Python2.6和2.7中仍然有效,但现在已被弃用,在Python3中不起作用;现在,您应该从以下位置使用
作为

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

或者,仅适用于Python 2:

except (IDontLikeYouException, YouAreBeingMeanException), e:
    pass
用逗号将异常与变量分开在Python2.6和2.7中仍然有效,但现在已被弃用,在Python3中不起作用;现在您应该将
用作

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

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)
我只指定这些异常以避免隐藏bug,如果遇到bug,我希望从中获得完整的堆栈跟踪

这里记录了这一点:

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

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    sys.exit(0)
注意,在Python3中,
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或更高版本,请切换到新的方式,以便在升级时代码保持兼容

抑制上下文管理器
公认的答案实际上是至少4行代码:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass
try
外,
通过
行可以在一行中处理,方法是:

因此,当您想对某些异常传递
时,请使用
suppress

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

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)
我只指定这些异常以避免隐藏bug,如果遇到bug,我希望从中获得完整的堆栈跟踪

这里记录了这一点:

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

import sys

try:
    mainstuff()
except (KeyboardInterrupt, EOFError) as err: 
    print(err)
    print(err.args)
    sys.exit(0)
注意,在Python3中,
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或更高版本,请切换到新的方式,以便在升级时代码保持兼容

抑制上下文管理器
公认的答案实际上是至少4行代码:

try:
    do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
    pass
try
外,
通过
行可以在一行中处理,方法是:

因此,当您想对某些异常传递
时,请从以下位置使用
suppress

try
语句可以有多个except子句来指定 不同异常的处理程序。最多将有一个处理程序 执行。处理程序仅处理在中发生的异常 对应的try子句,不在同一try的其他处理程序中 陈述Exception子句可以将多个异常命名为 括号中的元组,例如:

except (RuntimeError, TypeError, NameError):
    pass
请注意,此元组周围的括号是必需的,因为 除了
ValueError之外,e:
是用于正常情况下的语法 在现代Python中编写为
,但ValueError为e:
(已描述 下)。为了向后兼容,仍然支持旧语法。 这意味着