擅长:python、mysql、java
<ol>
<li>你给出的两个代码块是
<strong>不</strong>等同</li>
<li>你描述的代码
做事情的方式有一个严重的缺陷:
如果打开文件失败
将在
<code>finally</code>子句,因为<code>f</code>不是
已绑定。</li>
</ol>
<p>等效的旧式代码是:</p>
<pre><code>try:
f = open("file", "r")
try:
line = f.readline()
finally:
f.close()
except IOError:
<whatever>
</code></pre>
<p>如您所见,<code>with</code>语句可以减少出错的可能性。在较新版本的Python(2.7,3.1)中,还可以在一个<code>with</code>语句中组合多个表达式。例如:</p>
<pre><code>with open("input", "r") as inp, open("output", "w") as out:
out.write(inp.read())
</code></pre>
<p>除此之外,我个人认为尽早发现任何异常都是坏习惯。这不是例外的目的。如果可能失败的IO函数是更复杂操作的一部分,那么在大多数情况下,IOError应该中止整个操作,因此应该在外部处理。使用<code>with</code>语句,可以在内部级别删除所有这些<code>try...finally</code>语句。</p>