1. 程式人生 > >Python中關於try...finally的一些疑問

Python中關於try...finally的一些疑問

問題 但是 一個 ++ 關於 文章 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的一些疑問