python中神奇的finally

今天作者真的被try....except....finally給坑了一把,也確實別這騷操作驚豔到了,僅此在這做個記錄,給自己給大家一個提醒,畢竟好記性不如爛筆頭。

首先給大家看一段代碼:

def a():
try:
print('try print')
return 'try return'
except:
print('except print')
return 'except return'
finally:
print('finally print')
return 'finally return'
print(a())

大家猜一下運行結果是什麼,a這個函數的返回值是什麼,知道嗎?

下面看運行結果:

python中神奇的finally

怎麼樣,有沒有被驚到。明明在try裡面return了try return,為什麼最後return的是finally return。

經過我查閱資料得知,原來finally裡面的代碼,不管前面執行結果如何,是否return,它都會執行,如果前面有return 的結果,會被finally 裡的return 給覆蓋的。

那麼問題來了,如果把上例中,return 'finally return' 給註釋掉,finally裡的語句還會不會執行呢? 下面來看執行結果吧:

python中神奇的finally

這是正常情況,既try中無異常。

那麼try中語句如果異常了,直接執行到except語句並返回了,那麼finally中的語句是不是還是一如既往的執行呢?下面看圖:

python中神奇的finally

由以上三個實驗可以得出結論,finally 中的代碼,不管前面是否有無異常,是否有無返回,都會執行,並且以finally 代碼塊中的return會覆蓋

之前的return結果。

有人會問了,覆蓋這詞不合適吧

你怎麼知道上圖中的代碼try... except 中的return 執行了呢? 下面我們把return的字符串換成函數試下:

python中神奇的finally

由上圖運行結果可知, try b print 被打印出來了,證明try中的return確實執行了,最終結果只是被finally中的return給覆蓋了而已。

同樣我們可以測試 異常情況下的和try... except...else...finally 模式下的以上各種情況,都會發現我們上述的結果時正確的。

finally 要慎用啊,想當然的使用會讓你在工作中付出應有的代價,我已經付出了,希望各位童鞋要引以為戒,共同進步。

python中神奇的finally

最後貼個好看的圖當門面吧(吐舌)


分享到:


相關文章: