<blockquote>
<h2>How do I catch multiple exceptions in one line (except block)</h2>
</blockquote>
<p>执行以下操作:</p>
<pre><code>try:
may_raise_specific_errors():
except (SpecificErrorOne, SpecificErrorTwo) as error:
handle(error) # might log or have some other default behavior...
</code></pre>
<p>括号是必需的,因为较旧的语法使用逗号将错误对象指定给名称。<code>as</code>关键字用于赋值。您可以为错误对象使用任何名称,我个人更喜欢<code>error</code>。</p>
<h2>最佳实践</h2>
<p>要以与Python当前和正向兼容的方式执行此操作,您需要用逗号分隔异常,并用括号将其括起来,以区别于以前的语法,后者通过跟随要用逗号捕获的异常类型将异常实例分配给变量名。</p>
<p>下面是一个简单用法的示例:</p>
<pre><code>import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError): # the parens are necessary
sys.exit(0)
</code></pre>
<p>我只指定这些异常以避免隐藏错误,如果遇到错误,我希望从中获得完整的堆栈跟踪。</p>
<p>这里有文档:<a href="https://docs.python.org/tutorial/errors.html" rel="noreferrer">https://docs.python.org/tutorial/errors.html</a></p>
<p>您可以将异常分配给一个变量,(<code>e</code>是常见的,但是如果您有长时间的异常处理,或者您的IDE只突出显示大于该值的选择,那么您可能更喜欢一个更详细的变量,就像我的一样。)实例有一个args属性。下面是一个例子:</p>
<pre><code>import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError) as err:
print(err)
print(err.args)
sys.exit(0)
</code></pre>
<p>注意,在Python 3中,<code>err</code>对象在结束<code>except</code>块时超出了范围。</p>
<h2>不赞成</h2>
<p>您可能会看到用逗号指定错误的代码。这种用法是Python2.5和更早版本中唯一可用的形式,已被弃用,如果希望代码在Python3中向前兼容,则应更新语法以使用新形式:</p>
<pre><code>import sys
try:
mainstuff()
except (KeyboardInterrupt, EOFError), err: # don't do this in Python 2.6+
print err
print err.args
sys.exit(0)
</code></pre>
<p>如果您在代码库中看到逗号名称分配,并且您使用的是Python2.5或更高版本,请切换到新的方法,以便在升级时保持代码兼容。</p>
<h2>上下文管理器</h2>
<p>公认的答案实际上是4行代码,最少:</p>
<pre><code>try:
do_something()
except (IDontLikeYouException, YouAreBeingMeanException) as e:
pass
</code></pre>
<p>可以用<a href="https://docs.python.org/3/library/contextlib.html#contextlib.suppress" rel="noreferrer">suppress context manager, available in Python 3.4</a>在一行中处理<code>try</code>、<code>except</code>、<code>pass</code>行:</p>
<pre><code>from contextlib import suppress
with suppress(IDontLikeYouException, YouAreBeingMeanException):
do_something()
</code></pre>
<p>因此,当您想对某些异常使用<code>pass</code>时,请使用<code>suppress</code>。</p>