擅长:python、mysql、java
<p>我认为理解这一点的一个好方法是看一个独立于所有上下文管理器的单独示例:</p>
<pre><code>>>> def test ():
try:
print('Before raise')
raise Exception()
print('After raise')
finally:
print('In finally')
print('Outside of try/finally')
>>> test()
Before raise
In finally
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
test()
File "<pyshell#6>", line 4, in test
raise Exception()
Exception
</code></pre>
<p>因此您可以看到,当异常在<code>try</code>块中抛出时,</em>之前的任何代码都将被执行,<code>finally</code>块中的任何代码都将被执行。除此之外,其他的都被跳过了。这是因为抛出的异常结束了函数调用。但是由于异常是在<code>try</code>块中引发的,因此相应的<code>finally</code>块有最后一次运行的机会。在</p>
<p>现在,如果您注释掉函数中的<code>raise</code>行,您将看到所有代码都已执行,因为函数不会过早结束。在</p>