考虑:
def raiseMe( text="Test error" ):
raise Exception( text )
def break_in_finally_test():
for i in range(5):
if i==2:
try:
raiseMe()
except:
raise
else:
print "succeeded!"
finally:
print "testing this!"
break
if __name__=='__main__':
break_in_finally_test()
我希望看到Exception( "Test error" )
有人提出来,但是只会打印“ testing this”。当然,raiseMe()
无论成功与否,我们的意图是只打一次电话,但是如果引发异常,我本来希望看到的!
为什么中断吞下我明确提出的异常?
从https://docs.python.org/2.7/reference/compound_stmts.html#finally:
如果最后存在,则指定“清理”处理程序。将
执行try子句,包括任何else和else子句。如果在
任何子句中发生异常并且未进行处理,则将临时保存该异常。
将执行finally子句。如果存在已保存的异常,则会
在finally子句的末尾重新引发该异常。如果finally子句引发
另一个异常或执行return或break语句,则保存的
异常将被丢弃
这也反映了PEP341try...finally
之前的语句预期的行为:
这是一个尝试,除了finally块看起来像PEP341之前的样子:
try:
try:
raiseMe()
except:
raise
finally:
#here is where cleanup is supposed to happen before raising error
break
#after finally code: raise error
由于错误的产生永远不会在程序finally
段中发生,因此实际上也不会产生。
为了保持与Python <= 2.4的向后兼容性,必须以这种方式完成。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句