2017-10-11 43 views
0

這個問題涉及到好的和壞的做法: 從C編程中,我習慣於在函數的開始處檢查傳遞的參數,從而在出現錯誤時返回錯誤代碼(例如NULL指針)。Python何時會出現錯誤?

在Python中,當允許通過的Queue對象是None或錯誤類型,並且試圖對此無效隊列對象進行操作時,會自動引發異常。它是很好的做法,檢查數據類型提前像

def foo(queue): 
    if issubclass(Queue, arg): 
     raise ... 
    # ... 

還是應該錯誤處理,而被留下來作爲呼叫功能的任務,因爲事情是錯的呢?我很想用第一種方式去做,但是覺得它可能是錯誤的。

+1

我認爲所有好的功能和模塊應該有內置的錯誤處理方法。 – ShreyasG

+1

除了別的,鴨子打字的重點在於你**不應**測試某物是任何特定類型的子類。如果你需要檢查任何東西,你會檢查它是否有你需要調用的屬性或方法。 –

+1

我認爲提早失敗對於任何語言都是很好的做法。 – khelwood

回答

1

選擇哪種方式取決於具體情況,應該是「設計合同」中所述合同的一部分。

提到的設計方法使用了一個隱喻,表示函數滿足其合同。如果調用者通過某些參數,則該函數有義務返回該合同中指定的內容。

如果調用者沒有根據契約傳遞值,那麼返回調用者意外的值或以任何方式失敗(當然,它不能隱藏任何問題)並不是函數的錯誤。

創建軟件時,其中一項任務是選擇正確的「合同」。與你的問題相對應的兩種方法可以總結爲:

1)合同說:盡你所能。這是通常的方式。該功能更小,更快,更通用,因爲它可能適用於未提前計劃的情況。它充分利用了Python的鴨子打字功能。

2)合同說:不冒險,防守,驗證投入等,因爲有充足的理由這樣做。

良好的編碼習慣很簡單:知道你的函數的契約,相應的代碼,相應地編寫(至少)文檔字符串。

只有瞭解合同的知識,您才能確信自己已經完成了一項好的編程工作。 (這icludes不擔心可能的「改進」)

相關問題