請啟用JavaScript來查看內容

Python try/except:一道看似簡單,卻隱藏著陷阱

    一個非常簡單的函式:

    1
    2
    3
    4
    5
    6
    
    def func():
        x = 1
        return x
    
    
    print(func())
    

    我們都知道最後會輸出1



    再來回答看看底下這段程式會輸出什麼呢?

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    def func():
        try:
            x = 1
            return x
        except Exception as e:
            x = 2
            return x
        finally:
            x = 3
            return x
    
    
    print(func())
    

    (a) 1
    (b) 2
    (c) 3







    答案竟然是 (c) 3 ?!
    如何?跟你想像的一樣嗎?

    照理來講,
    在函式內執行 x = 1 之後就遇到了 return x 就該跳出迴圈了。

    But 🤨
    這段程式是放在 try/except 異常處理中,
    而當中如果有 finally,那 finally 是無論例外有沒有發生都會執行的。

    上面那道題目,如果使用IDE的單步執行來偵錯的話,會發現 try 內的 return x 執行完後,會跳到 finally 內執行 x = 3return x,所以最後函式會返回3


    因此在撰寫程式時,避免把 return 寫在 try/except 異常處理中,以免發生這種較不直觀的流程。
    畢竟發生異常也要把異常處理好再離開嘛~




    我想打起精神來,卻不小心把它打死了


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師