使用 Return 语句的奇怪的 try-But-Else-finally 行为

这是一些行为特殊的代码。这是我写的行为的简化版本。这仍然会证明奇怪的行为,我有一些具体的问题,为什么会发生这种情况。

我在 Windows 7上使用 Python 2.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
  • 为什么演示1返回3而不是1?
  • 为什么演示2打印6而不是打印6 w/4或5?
37889 次浏览

因为 finally语句是要执行的 保证语句(假设没有停电或任何 Python 控制范围之外的情况)。这意味着在函数返回之前,它必须运行 finally 块,该块返回一个不同的值。

巨蟒文件州:

当在 try... finally 语句的 try 套件中执行 return、 break 或 keep 语句时,finally 子句也在执行过程中执行。’

函数的返回值由执行的最后一个返回语句确定。由于 finally 子句总是执行,因此在 finally 子句中执行的 return 语句总是最后执行的语句:

这意味着当您尝试返回时,将调用 finally块,返回它的值,而不是您应该有的值。

执行令如下:

  1. Try block all complete Normal-> finally block-> function end 尝试阻塞所有正常完成-> 最后阻塞-> 函数结束
  2. 尝试块运行,进入异常 A-> finally block-> function end
  3. Try block 创建一个返回值并调用 return-> finally block-> popup return value-> function end

因此,finally 块中的任何返回都将提前结束这些步骤。

请注意,PEP601禁止 finally 子句中的 return 语句,但是它被拒绝了。 然而,在 PEP8的样式指南中已经增加了应该避免的内容。