怪异的Try-Except-Else-最后的行为与Return语句

这是一些行为特殊的代码。 这是我写的行为的简化版本。 这仍然会显示出怪异的行为,并且为什么会出现这个问题我有一些具体的问题。

我在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 if __name__ == "__main__": print "*** DEMO ONE ***" print demo1() print "****************" print print "*** DEMO TWO ***" print demo2() print "****************" 

当你运行这个脚本时,它会打印:

 *** DEMO ONE *** 3 **************** *** DEMO TWO *** 6 3 **************** 

为什么演示版返回3而不是1? 为什么演示两个打印6而不是打印6瓦/ 4或5?

谢谢你的帮助。

因为finally声明保证被执行(当然,假设没有停电或者Python控制之外的任何东西)。 这意味着在函数返回之前,它必须运行finally块,它返回一个不同的值。

Python文档状态:

当在try … finally语句的try套件中执行return,break或continue语句时,finally子句也会在“出路”中执行。 在最后的条款中,continue语句是非法的。 (原因是目前的实施存在问题 – 将来可能会取消这个限制)。

这意味着当你尝试返回时, finally块被调用,返回它的值,而不是你想要的那个。

执行顺序是:

  1. 尝试阻止所有正常完成 – > finally块 – >function结束
  2. 尝试块运行,并进入exceptionA – > finally块 – >function结束
  3. 尝试块做一个返回值,并调用返回 – > finally块 – >popup式返回值 – >函数结束

所以,finally块中的任何返回都会提前结束。

Interesting Posts