python的try finally (還真不簡單)
阿新 • • 發佈:2017-12-21
做的 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 (還真不簡單)