有什么办法可以做这样的事情(因为在两个异常中都采取的措施是
say please
):
try:
# do something that may fail
except IDontLikeYouException, YouAreBeingMeanException:
# say please
现在,这确实不起作用
可以如下这么做
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)
我仅指定这些异常以避免隐藏错误,如果遇到错误,我希望从中获得完整的堆栈跟踪。
在此处进行记录:
https
:
//docs.python.org/tutorial/errors.html
您可以将异常分配给变量(这
e
很常见,但是,如果您需要长时间处理异常,或者您的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
在
try
,
except
,
pass
线可以与单线处理
抑制上下文管理器,可以在Python 3.4
:
from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
因此,当您想
pass
在某些例外情况下使用
suppress
从
Python文档-> 8.3处理异常
:
一条
try
语句可能具有多个except子句,以指定不同异常的处理程序。
最多将执行一个处理程序。
处理程序仅处理在相应的try子句中发生的异常,而不处理同一try语句的其他处理程序中的异常。
exclude子句可以将多个异常命名为带括号的元组,例如:
except (RuntimeError, TypeError, NameError):
pass
请注意,必须在该元组周围加上括号,因为
ValueError, e:
用于
except ValueError as e:
现代Python中
通常编写的语法
除外
(如下所述)。
为了向后兼容,仍支持旧语法。
这意味着
except RuntimeError, TypeError
不等于
except (RuntimeError, TypeError):
但
except RuntimeError as
TypeError:
不是您想要的。
相关链接:
[一行捕获多个异常] https://stackoverflow.com/questions/6470428/catch-multiple-exceptions-in-one-line-except-block
优质文章,推荐阅读: