在一行中捕获多个异常(except块)
在一行中捕获多个异常(except块)
我知道我可以这样做:
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, YouAreBeingMeanException: # say please
现在这不会奏效,因为它符合以下语法的语法:
try: # do something that may fail except Exception, e: # say please
因此,我为捕获这两个不同的异常所做的努力并没有完全实现。
有没有办法做到这一点?
如何在一个except块中捕获多个异常?
可以这样做:
try: may_raise_specific_errors(): except (SpecificErrorOne, SpecificErrorTwo) as error: handle(error) # might log or have some other default behavior...
由于旧的语法使用逗号将错误对象分配给名称,因此需要括号。使用as
关键字进行分配。您可以为错误对象使用任何名称,但我个人更喜欢error
。
最佳实践
为了以一种当前和向前兼容的方式进行此操作,您需要使用逗号将异常分开,并用括号包装它们,以区分早期的语法,该语法通过在要捕获的异常类型后跟逗号来分配异常实例给变量名称。
以下是一个简单使用示例:
import sys try: mainstuff() except (KeyboardInterrupt, EOFError): # the parens are necessary sys.exit(0)
我只指定了这些异常以避免隐藏错误,如果我遇到错误,我希望从中获得完整的堆栈跟踪。
此处有文档: https://docs.python.org/tutorial/errors.html
您可以将异常分配给一个变量(e
是常见的,但如果您具有较长的异常处理或您的IDE仅突出显示大于该选项的选项,则可以更喜欢更详细的变量,就像我的IDE一样。)实例具有args属性。以下是一个示例:
import sys try: mainstuff() except (KeyboardInterrupt, EOFError) as err: print(err) print(err.args) sys.exit(0)
请注意,在Python 3中,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或更高版本,请切换到新的执行方式,以使您的代码在升级时保持兼容性。
suppress
上下文管理器
接受的答案实际上是最少的4行代码:
try: do_something() except (IDontLikeYouException, YouAreBeingMeanException) as e: pass
suppress上下文管理器可在Python 3.4中使用:,try
,except
,和pass
行可以在单行中处理。
from contextlib import suppress with suppress(IDontLikeYouException, YouAreBeingMeanException): do_something()
因此,当您想要pass
某些异常时,请使用suppress
。
来自Python文档:
一个except子句可以将多个异常命名为一个带括号的元组,例如
except (IDontLikeYouException, YouAreBeingMeanException) as e: pass
或者,仅适用于Python 2:
except (IDontLikeYouException, YouAreBeingMeanException), e: pass
在Python 2.6和2.7中,使用逗号将异常与变量分离仍然可以工作,但现在已过时并且在Python 3中不起作用;现在应该使用as
。