Python中關於try...finally的一些疑問
阿新 • • 發佈:2018-07-26
問題 但是 一個 ++ 關於 文章 highlight exc 運行
最近看Vamei的Python文章,其中一篇講異常處理的,原本看完沒啥疑惑,或許是自己想的簡單了。
看到評論,一個園友的問題引起我的興趣。
他的問題是
def func(x): try: return ++x finally: return x+1
print func(11)
你覺得是幾?
看到問題,覺得肯定是12啊,這有什麽問題呢?
下邊看看我寫的例子,就明白其中的問題了。
先看這個
def f(): try: print 1 return 1 finally: print 0 return 0
print f()
結果為 1 0 0
以運行結果為準,說明無論try裏執行什麽,即使是return,也會調用finally的。
但是有一個問題,為什麽最後輸出的不是1而是0呢?明明try裏面已經返回1了!
看下邊的代碼
def f(): try: print 1 return 1 finally: print 0 #return 0
將finally的return屏蔽掉,你或許猜到結果了
結果為 1 0 1
詫異嗎?
對比上個結果,說明try的返回值被finally的返回值覆蓋了,或許是因為一個函數只能有一個返回值,以最後一個結果為準
由此我想再驗證下else的情況,如下
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中的語句。
finally是無論是否有異常,最後都要做的一些事情。”
這裏補充一句,在含有return的情況下,並不會阻礙finally的執行。
Python中關於try...finally的一些疑問