python的try finally (还真不简单)

Posted 永远的幻想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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里都是做某事   而不是处理返回

 

以上是关于python的try finally (还真不简单)的主要内容,如果未能解决你的问题,请参考以下文章

Try-Catch-Finally语句块执行问题

PHP 人工作难找,还真不全是能力问题!

python 同一层的try, except,finally ,执行顺序是什么

干货篇 | Nginx 我还真不信你学不会(上)

Python异常捕捉try except else finally有return时执行顺序探究

微服务架构原理开发实战:不看此文你还真不知道微服务是个什么鬼