2016-02-05 64 views
6

在Python中使用try/except塊時,是否有建議將它委託給可能引發異常,或在父函數中捕獲它的方法?python中異常處理的位置

例如,以下哪項是首選?

def my_function(): 
    s = something.that.might.go_wrong() 
    return s 

def main(): 
    try: 
     s = my_function() 
    except Exception: 
     print "Error" 

def my_function(): 
    try: 
     s = something.that.might.go_wrong() 
     return s 
    except Exception: 
     print "Error" 

def main(): 
    s = my_function() 

PEP 8似乎是安靜的事,我似乎找到了兩種情況的例子隨處可見。

回答

6

它確實取決於有問題的函數的語義。一般來說,如果你正在編寫一個庫,你的庫可能應該處理在庫內引發的異常(可選地將它們重新提升爲新的特定於庫的異常)。

但是,在個人功能層面上,您想要考慮的主要問題是您希望處理異常的上下文/範圍 - 如果在內部函數內例外情況下可以執行合理的不同操作,在內部函數中處理它可能很有用;否則,在外部函數中處理它可能更有意義。

對於編寫輸出的具體情況,僅在最高級別執行該操作通常是有用的,並且只有內部函數(a)返回值或(b)引發異常。這使代碼更容易測試,因爲您不必擔心測試副作用輸出。

+0

謝謝@Amber。你在考試能力方面做得很好,這與AlokThakur的答案很好地結合在一起。 – mcy

0

我總是使用第二個。對我來說,似乎應該只在該函數中處理函數的問題。這將爲用戶提供一個乾淨且無障礙的界面,以便您稍後可以將您的代碼放入一個庫中。

可能有些情況下,您希望在函數外使用異常。例如,如果您想在出現問題時打印特定消息,則應該使用該功能以外的例外。

但是,如果您想讓用戶能夠決定自己的異常消息,則可以將異常聲明作爲參數提供給函數。所以我想第二個例子(函數內的異常)將是普遍的,因此應該是首選。

2

如果您遵循「一個函數應該處理一個任務」的規則,那麼您不應該在該函數中處理異常,讓它在意外輸入時大聲地失敗。調用這種功能的父功能可以處理給用戶更好的體驗。

我們可以參考python內置函數來獲取pythonic方式

+0

謝謝@AlokThakur。您的回答是有道理的,並且與琥珀關於測試功能的容易程度的答案密切相關。 – mcy