如何在一行中捕获多个异常(块除外)
做这个:
try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
由于使用了逗号将错误对象分配给名称的较旧语法,因此需要使用括号。 as关键字用于分配。 您可以为错误对象使用任何名称,我个人更喜欢error 。
最佳实践
要以目前与Python向前兼容的方式做到这一点,您需要用逗号分隔Exceptions,并用括号将其包裹起来,以区别于早期的语法,后者通过遵循Exception类型来将异常实例分配给变量名称,以将其捕获为逗号。
这是一个简单用法的示例:
import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
我仅指定这些异常以避免隐藏错误,如果遇到错误,我希望从中获得完整的堆栈跟踪。
您可以将异常分配给变量( 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 。