我想知道在Python中指示無效參數組合的最佳實踐。 我遇到過一些你有這樣功能的狀況: java
def import_to_orm(name, save=False, recurse=False): """ :param name: Name of some external entity to import. :param save: Save the ORM object before returning. :param recurse: Attempt to import associated objects as well. Because you need the original object to have a key to relate to, save must be `True` for recurse to be `True`. :raise BadValueError: If `recurse and not save`. :return: The ORM object. """ pass
惟一使人煩惱的是每一個包都有本身的,一般略有不一樣的BadValueError
。 我知道在Java中存在java.lang.IllegalArgumentException
- 是否很好理解每一個人都將在Python中建立本身的BadValueError
或者是否有另外一種首選方法? 數組
我大多剛剛看到在這種狀況下使用的內置ValueError
。 函數
我會繼承ValueError
spa
class IllegalArgumentError(ValueError): pass
有時候建立本身的異常更好,可是從內置的異常繼承,儘量接近你想要的。 code
若是您須要捕獲該特定錯誤,那麼擁有一個名稱會頗有幫助。 orm
我不肯定我贊成ValueError
繼承 - 我對文檔的解釋是, ValueError
只應該由內置引起...繼承它或者本身提高它彷佛是不正確的。 繼承
當內置操做或函數接收到具備正確類型但不適當值的參數時引起,而且狀況不會由更準確的異常(如IndexError)描述。 ci
- ValueError文檔 文檔
我只會提出ValueError ,除非你須要一個更具體的例外。 get
def import_to_orm(name, save=False, recurse=False): if recurse and not save: raise ValueError("save must be True if recurse is True")
作class BadValueError(ValueError):pass
真的沒有意義class BadValueError(ValueError):pass
- 你的自定義類與ValueError的使用徹底相同,那麼爲何不使用它呢?
贊成Markus建議滾動本身的異常,但異常的文本應該澄清問題在參數列表中,而不是單個參數值。 我建議:
class BadCallError(ValueError): pass
在缺乏特定調用所需的關鍵字參數時使用,或者參數值單獨有效但彼此不一致。 當特定參數是正確類型但超出範圍時, ValueError
仍然是正確的。
這不該該是Python中的標準異常嗎?
通常來講,我但願Python樣式在將錯誤輸入與函數(調用者的錯誤)與函數內的錯誤結果(個人錯誤)區分開來時要更加清晰。 所以可能還有BadArgumentError來區分參數中的值錯誤和本地值中的值錯誤。