带有Return语句的奇怪的Try-Except-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?


蛊毒传说
浏览 497回答 3
3回答

白猪掌柜的

因为保证可以执行finally语句(因此,假定没有断电或Python无法控制的任何事情)。这意味着在函数可以返回之前,它必须运行finally块,该块返回一个不同的值。在Python文档状态:当在try ... finally语句的try套件中执行return,break或Continue语句时,finally子句也会在“出路”上执行。在finally子句中,continue语句是非法的。(原因是当前实施存在问题-将来可能会取消此限制)。这意味着,当您尝试返回时,将finally调用该块,并返回其值,而不是原来的值。

Smart猫小萌

执行顺序为:尝试阻止所有正常完成->最终阻止->函数结束尝试运行块并进入异常A->最终阻塞->函数结束尝试块返回值并调用返回->最终阻止->弹出返回值->函数结束因此,finally块中的任何返回都将提前结束步骤。

守着星空守着你

因为在return调用该语句时,Python会检查是否finally需要执行任何打开的子句(请参见上面的引用)。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python