<blockquote>
<h2>Catching an exception while using a Python 'with' statement</h2>
</blockquote>
<p>with语句在没有<code>__future__</code>导入<a href="https://docs.python.org/2/library/__future__.html" rel="noreferrer">since Python 2.6</a>的情况下可用。您可以将其命名为<a href="https://docs.python.org/2/whatsnew/2.5.html#pep-343-the-with-statement" rel="noreferrer">early as Python 2.5</a>(但现在是升级的时候了!)使用:</p>
<pre><code>from __future__ import with_statement
</code></pre>
<p>这是你最接近的纠正方法。你就快到了,但是<code>with</code>没有<code>except</code>子句:</p>
<blockquote>
<pre><code>with open("a.txt") as f:
print(f.readlines())
except: # <- with doesn't have an except clause.
print('oops')
</code></pre>
</blockquote>
<p>上下文管理器的<code>__exit__</code>方法,如果返回<code>False</code>,则在完成时将重新引发错误。如果它返回<code>True</code>,它将抑制它。内置的<code>open</code>不返回<code>True</code>,所以您只需要尝试嵌套它,除了块:</p>
<pre><code>try:
with open("a.txt") as f:
print(f.readlines())
except Exception as error:
print('oops')
</code></pre>
<p>标准样板文件:不要使用捕获<code>BaseException</code>和其他所有可能的异常和警告的裸<code>except:</code>。至少和<code>Exception</code>一样具体,对于这个错误,可能会捕获<code>IOError</code>。只捕获准备好处理的错误。</p>
<p>在这种情况下,你应该:</p>
<pre><code>>>> try:
... with open("a.txt") as f:
... print(f.readlines())
... except IOError as error:
... print('oops')
...
oops
</code></pre>