我應該在Python中針對壞/非法參數組合提出哪一個例外?

我想知道在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或者是否有另外一種首選方法? 數組


#1樓

我大多剛剛看到在這種狀況下使用的內置ValueError函數


#2樓

我會繼承ValueError spa

class IllegalArgumentError(ValueError):
    pass

有時候建立本身的異常更好,可是從內置的異常繼承,儘量接近你想要的。 code

若是您須要捕獲該特定錯誤,那麼擁有一個名稱會頗有幫助。 orm


#3樓

我不肯定我贊成ValueError繼承 - 我對文檔的解釋是, ValueError 應該由內置引起...繼承它或者本身提高它彷佛是不正確的。 繼承

當內置操做或函數接收到具備正確類型但不適當值的參數時引起,而且狀況不會由更準確的異常(如IndexError)描述。 ci

- ValueError文檔 文檔


#4樓

我只會提出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的使用徹底相同,那麼爲何不使用它呢?


#5樓

贊成Markus建議滾動本身的異常,但異常的文本應該澄清問題在參數列表中,而不是單個參數值。 我建議:

class BadCallError(ValueError):
    pass

在缺乏特定調用所需的關鍵字參數時使用,或者參數值單獨有效但彼此不一致。 當特定參數是正確類型但超出範圍時, ValueError仍然是正確的。

這不該該是Python中的標準異常嗎?

通常來講,我但願Python樣式在將錯誤輸入與函數(調用者的錯誤)與函數內的錯誤結果(個人錯誤)區分開來時要更加清晰。 所以可能還有BadArgumentError來區分參數中的值錯誤和本地值中的值錯誤。

相關文章
相關標籤/搜索