我应该在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来区分参数中的值错误和本地值中的值错误。

相关文章
相关标签/搜索