我知道我能做到:
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 的方式执行此操作,您需要使用逗号分隔异常并用括号括起它们,以区别于将异常实例分配给变量名的早期语法,方法是遵循要捕获的异常类型逗号。
这是一个简单用法的例子:
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
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
行except
的try
可以使用suppress 3.4 中的suppress 上下文管理器在一行中处理:
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
因此,当您想要pass
某些异常时,请使用suppress
。
对于 python 2.5 及更早版本,正确的语法是:
except (IDontLikeYouException, YouAreBeingMeanException), e:
print e
其中e
是 Exception 实例。