我应该在Python中对不良/非法参数组合提出哪个exception?

我想知道在Python中指示无效参数组合的最佳实践。 我遇到过几种你有这样的function的情况:

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中创build他们自己的BadValueError或者还有其他的首选方法?

我只会提出ValueError ,除非你需要一个更具体的例外..

 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是一样的,那为什么不使用它呢?

我会从ValueErrorinheritance

 class IllegalArgumentError(ValueError): pass 

创build自己的exception有时候更好,但是从内build的inheritance,尽可能接近你想要的。

如果你需要捕捉那个特定的错误,有一个名字是有帮助的。

我主要只是看到了在这种情况下使用的内置的ValueError

我不确定我是否同意从ValueErrorinheritance – 我对文档的解释是, ValueError 只能被内build的…从inheritance或提升它自己似乎是不正确的。

当内build的操作或函数接收到一个具有正确types但值不恰当的参数时引发,而这种情况并没有被更精确的exception(如IndexError)所描述。

– ValueError文档

同意马库斯的build议,推出你自己的例外,但例外的文本应该澄清,问题是在参数列表中,而不是单个参数的值。 我会build议:

 class BadCallError(ValueError): pass 

在特定调用所需的关键字参数丢失时使用,或参数值单独有效但彼此不一致。 当特定的参数是正确的types但超出范围时, ValueError仍然是正确的。

这不应该是Python中的标准exception吗?

一般来说,我希望Python风格在函数(我的错误)中将错误的input与函数(调用者的错误)区分为错误的结果会更加清晰。 所以也可能有一个BadArgumentError来区分参数中的值错误和本地值错误。