<p>从<a href="https://docs.python.org/2/tutorial/errors.html#handling-exceptions" rel="nofollow">documentation</a>:</p>
<blockquote>
<p>A finally clause is always executed before leaving the try statement,
whether an exception has occurred or not. When an exception has
occurred in the try clause and has not been handled by an except
clause (or it has occurred in a except or else clause), it is
re-raised after the finally clause has been executed.</p>
</blockquote>
<p>所以不是<code>NameError</code>没有被提升(它将被提升),而是<code>finally</code>在<code>try:</code>块离开之前执行。你知道吗</p>
<p>无论如何,我建议您这样定义函数:</p>
<pre><code>def get_input_data(input_dict, attributes, check=False):
"""If check is True, raises a KeyError if a key in attributes is not
in the input dictionary."""
if check:
return {a: input_dict[a] for a in attributes}
else:
return {a: input_dict[a] for a in input_dict.viewkeys() & attributes}
</code></pre>
<p>这样,如果字典中没有属性,用户就可以自己决定是否抛出错误。这就是异常的目的,允许代码的用户决定在出现异常但不是不可预见的情况时应该发生什么。你知道吗</p>
<p>因此,作为这个函数的用户,我可以这样写:</p>
<pre><code>try:
get_input_data(input_dict, attributes, check=True)
except KeyError:
# do what makes sense
</code></pre>
<p>如果我想进行错误检查。你知道吗</p>