1. 程式人生 > >python的try finally (還真不簡單)

python的try finally (還真不簡單)

做的 except 對比 return rdquo 是否 name 自己 strong

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 (還真不簡單)