这是一些行为异常的代码。这是我所写行为的简化版本。这仍然会证明这种奇怪的行为,我有一些关于为什么会发生这种情况的具体问题。
我正在Windows7上使用Python2.6.6。
def demo1():
try:
raise RuntimeError,"To Force Issue"
except:
return 1
else:
return 2
finally:
return 3
def demo2():
try:
try:
raise RuntimeError,"To Force Issue"
except:
return 1
else:
return 2
finally:
return 3
except:
print 4
else:
print 5
finally:
print 6
结果:
>>> print demo1()
3
>>> print demo2()
6
3
为什么演示一返回的是3而不是1?
为什么演示2打印6而不是打印6 w/4或5?
3条答案
按热度按时间8fq7wneg1#
因为
finally
语句保证被执行(好吧,假设没有断电或python控制之外的任何事情)。这意味着在函数返回之前,它必须运行finally块,该块返回不同的值。python文档声明:
当在try…finally语句的try套件中执行return、break或continue语句时,finally子句也会“在退出时”执行
函数的返回值由最后执行的return语句确定。由于finally子句始终执行,因此finally子句中执行的return语句将始终是最后执行的语句:
这意味着当您尝试返回时
finally
调用块,返回它的值,而不是您本来应该有的值。vi4fp9gy2#
执行顺序为:
try block all completed normal->finally block->function end
尝试块运行并进入异常a->finally block->function ends
尝试块生成返回值并调用return->finally block->popup return value->function ends
因此,finally块中的任何返回都将提前结束步骤。
rbpvctlc3#
注意,pep601禁止finally子句中的返回语句,但已被拒绝。然而,pep8中的样式指南中增加了应避免的内容。