我应该在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是一样的,那为什么不使用它呢?
我会从ValueError
inheritance
class IllegalArgumentError(ValueError): pass
创build自己的exception有时候更好,但是从内build的inheritance,尽可能接近你想要的。
如果你需要捕捉那个特定的错误,有一个名字是有帮助的。
我主要只是看到了在这种情况下使用的内置的ValueError
。
我不确定我是否同意从ValueError
inheritance – 我对文档的解释是, ValueError
只能被内build的…从inheritance或提升它自己似乎是不正确的。
当内build的操作或函数接收到一个具有正确types但值不恰当的参数时引发,而这种情况并没有被更精确的exception(如IndexError)所描述。
– ValueError文档
同意马库斯的build议,推出你自己的例外,但例外的文本应该澄清,问题是在参数列表中,而不是单个参数的值。 我会build议:
class BadCallError(ValueError): pass
在特定调用所需的关键字参数丢失时使用,或参数值单独有效但彼此不一致。 当特定的参数是正确的types但超出范围时, ValueError
仍然是正确的。
这不应该是Python中的标准exception吗?
一般来说,我希望Python风格在函数(我的错误)中将错误的input与函数(调用者的错误)区分为错误的结果会更加清晰。 所以也可能有一个BadArgumentError来区分参数中的值错误和本地值错误。