为了账号安全,请及时绑定邮箱和手机立即绑定

带有Return语句的奇怪的Try-Except-Else-Finally行为

带有Return语句的奇怪的Try-Except-Else-Finally行为

慕桂英546537 2019-12-12 12:10:19
这是一些行为特殊的代码。这是我编写的行为的简化版本。这仍然会显示出怪异的行为,我对为什么会发生这种现象有一些特定的疑问。我在Windows 7上使用Python 2.6.6。def demo1():    try:        raise RuntimeError,"To Force Issue"    except:        return 1    else:        return 2    finally:        return 3def 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()63为什么演示1返回3而不是1?为什么演示2打印6而不是打印6 w / 4或5?
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

因为保证可以执行finally语句(因此,假定没有断电或Python无法控制的任何事情)。这意味着在函数可以返回之前,它必须运行finally块,该块返回一个不同的值。


在Python文档状态:


当在try ... finally语句的try套件中执行return,break或Continue语句时,finally子句也会在“出路”上执行。在finally子句中,continue语句是非法的。(原因是当前实施存在问题-将来可能会取消此限制)。


这意味着,当您尝试返回时,将finally调用该块,并返回其值,而不是原来的值。



查看完整回答
反对 回复 2019-12-13
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

执行顺序为:

  1. 尝试阻止所有正常完成->最终阻止->函数结束

  2. 尝试运行块并进入异常A->最终阻塞->函数结束

  3. 尝试块返回值并调用返回->最终阻止->弹出返回值->函数结束

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



查看完整回答
反对 回复 2019-12-13
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

因为在return调用该语句时,Python会检查是否finally需要执行任何打开的子句(请参见上面的引用)。

查看完整回答
反对 回复 2019-12-13
  • 3 回答
  • 0 关注
  • 350 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信