Python 使用Return语句执行奇怪的Try,但Else Finally行为除外

Python 使用Return语句执行奇怪的Try,但Else Finally行为除外,python,try-except,Python,Try Except,这是一些行为异常的代码。这是我所写行为的简化版本。这仍然会证明这种奇怪的行为,我有一些关于为什么会发生这种情况的具体问题 我正在Windows7上使用Python2.6.6 def demo1(): try: raise RuntimeError,"To Force Issue" except: return 1 else: return 2 finally: return 3 def demo2(

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

我正在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

因为
最终
语句是保证执行的(好吧,假设没有断电或Python控制之外的任何事情)。这意味着在函数返回之前,它必须运行finally块,该块返回不同的值

国家:

当在try…finally语句的try套件中执行return、break或continue语句时,finally子句也会“在退出时”执行

函数的返回值由最后执行的return语句确定。由于finally子句始终执行,因此finally子句中执行的return语句将始终是最后执行的语句:


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

执行顺序是:

  • try block all completed normal->finally block->function end
  • 尝试块运行并进入异常A->finally block->function ends
  • 尝试块生成返回值并调用return->finally block->popup return value->function ends
  • 因此,finally块中的任何返回都将提前结束步骤。

    注意,已经禁止finally子句中的返回语句,但它已被拒绝。
    但是,它被添加到样式指南中,因为它应该被避免。

    为什么在第二个示例中不打印5?我想这还没有得到很好的解释。返回一的答案很好,但是为什么第二个示例中的5没有打印出来呢?哦,我想我已经弄明白了,在最初的尝试中返回会导致它立即跳转到外部finally,因为
    finally
    块总是在运行。在演示2中,为什么它会执行嵌套finally,踢出到外部finally,然后返回嵌套finally以完成返回,而不是简单地从外部finally返回None?因为当调用
    return
    语句时,Python会检查需要执行的任何open
    finally
    子句(请参见上面的引用)。