使用return语句尝试异常行为

piztneat  于 2021-08-25  发布在  Java
关注(0)|答案(3)|浏览(357)

这是一些行为异常的代码。这是我所写行为的简化版本。这仍然会证明这种奇怪的行为,我有一些关于为什么会发生这种情况的具体问题。
我正在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?

8fq7wneg

8fq7wneg1#

因为 finally 语句保证被执行(好吧,假设没有断电或python控制之外的任何事情)。这意味着在函数返回之前,它必须运行finally块,该块返回不同的值。
python文档声明:
当在try…finally语句的try套件中执行return、break或continue语句时,finally子句也会“在退出时”执行
函数的返回值由最后执行的return语句确定。由于finally子句始终执行,因此finally子句中执行的return语句将始终是最后执行的语句:
这意味着当您尝试返回时 finally 调用块,返回它的值,而不是您本来应该有的值。

vi4fp9gy

vi4fp9gy2#

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

rbpvctlc

rbpvctlc3#

注意,pep601禁止finally子句中的返回语句,但已被拒绝。然而,pep8中的样式指南中增加了应避免的内容。

相关问题