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里都是做某事   而不是處理返回

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM