• Python中关于try...finally的一些疑问


    最近看Vamei的Python文章,其中一篇讲异常处理的,原本看完没啥疑惑,或许是自己想的简单了。

    看到评论,一个园友的问题引起我的兴趣。

    他的问题是

    def func(x):
        try:
            return ++x
        finally:
            return x+1
    

    print func(11)
    你觉得是几?

    看到问题,觉得肯定是12啊,这有什么问题呢?

    下边看看我写的例子,就明白其中的问题了。

    先看这个

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            return 0
    

    print f()
    结果为 1 0 0
    以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的。
    但是有一个问题,为什么最后输出的不是1而是0呢?明明try里面已经返回1了!
    看下边的代码

    def f():
        try:
            print 1
            return 1
        finally:
            print 0
            #return 0
    

    将finally的return屏蔽掉,你或许猜到结果了

    结果为 1 0 1

    诧异吗?

    对比上个结果,说明try的返回值被finally的返回值覆盖了,或许是因为一个函数只能有一个返回值,以最后一个结果为准

    由此我想再验证下else的情况,如下

    def f():
        try:
            print 1
            return 1
        except:
            return 2
        else:
            print 3
            return 3
        finally:
            print 0
            #return 0
    

    你觉得,没有异常else会执行吗?

    如你所料,并没有执行。

    结果为 1 0 1

    说明try里面运行完之后return,阻挡了else的执行,但是并没有影响finally的执行。

    借用Vamer文章的两句话:

    “如果try中没有异常,那么except部分将跳过,执行else中的语句。

    finally是无论是否有异常,最后都要做的一些事情。”

    这里补充一句,在含有return的情况下,并不会阻碍finally的执行。

  • 相关阅读:
    angularjs学习笔记一之显示数据,修改数据
    收藏/不再提醒
    CSS3动画
    Content-Type
    键盘快捷键
    url、href、src 详解
    关于docnment.write() 会清空原来的内容
    jq事件注意点
    echart的自适应
    键盘事件
  • 原文地址:https://www.cnblogs.com/liuye1990/p/9373900.html
Copyright © 2020-2023  润新知