在一行中捕获多个异常(块除外)
我知道我可以这样做:
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
线except
, try
可以用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实例。
上一篇: Catch multiple exceptions in one line (except block)
下一篇: Why "else"?