python的try finally (还真不简单)

https://www.cnblogs.com/cotton/p/3785999.html

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

print f()
结果为 1 0 0
以运行结果为准,说明无论try里执行什么,即使是return,也会调用finally的

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

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

结果为 1 0 1

诧异吗?

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

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中的语句。(前提是try里没有返回值)

finally是无论是否有异常,最后都要做的一些事情。”(无论try里是否有返回值)

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

 

 

 

又增补了点测试:

#根据  https://www.cnblogs.com/cotton/p/3785999.html 《Python中关于try...finally的一些疑问》



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


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


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

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


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

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

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


if __name__ == '__main__':
    print('测试1')
    print(test_finally_return1())
    print('测试2')
    print(test_finally_return2())
    print('测试3')
    print(test_else_finally1())
    print('测试4')
    print(test_else_finally2())
    print('测试5')
    print(test_else_return1())
    print('测试6')
    print(test_else_return2())
    print('测试7')
    print(test_else_finally3())

 

测试结果:

➜  test python3 test_try_finally.py
测试1
1
0
0
测试2
1
0
1
测试3
1
0
1
测试4
1
0
0
测试5
1
1
测试6
1
3
3
测试7
1
3
0
0

 

自己的总结:

不要在try else里写返回值。如果没有finally,就写在最后,或者只写在finally里。

try except else里都是做某事   而不是处理返回

 

posted @ 2017-12-21 15:01  永远的幻想  阅读(43971)  评论(0编辑  收藏  举报