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的執行。
“如果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里都是做某事 而不是處理返回