假设在python中你有一个接受三个命名参数的例程(如** args),但必须填写这三个中的任何两个。如果只填写了一个,那就是错误。如果这三个都是,那就是错误。你会提出什么样的错误? RuntimeError,一个专门创建的异常,还是其他?
答案 0 :(得分:14)
请记住,您可以继承Python的内置异常类(并且TypeError
肯定会是正确的内置异常类 - 如果参数的数量与签名不匹配,那就是Python引发的,在签名中没有*a
或**k
表格的正常情况下。我喜欢让每个包定义自己的class Error(Exception)
,然后根据需要的特定异常可以适当地多次继承,例如:
class WrongNumberOfArguments(thispackage.Error, TypeError):
然后,当我发现这样的问题时,我raise WrongNumberOfArguments
。
这样,任何知道这个包的调用者都可以捕获thispackage.Error
,如果他们需要处理特定于包的任何错误,而其他调用者(可能在调用链中更高)调用仍然会捕获更通用的TypeError
来处理任何错误,例如“函数调用中使用的参数数量错误”。
答案 1 :(得分:12)
为什么不做python的工作呢?
>>> abs(1, 2, 3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: abs() takes exactly one argument (3 given)
答案 2 :(得分:4)
如果(正如您在其中一条评论中所说)这是程序员错误,那么您可以引发AssertionError:
def two(**kwargs):
assert len(kwargs) == 2, "Please only provide two args"
顺便说一句,如果你只有三个命名参数,** kwargs似乎是一种奇怪的方法。更自然的可能是:
def two(a=None, b=None, c=None):
pass
答案 3 :(得分:3)
我会做一个特定的。您可以捕获它并处理该特定异常,因为它是您创建的特殊情况:)
答案 4 :(得分:0)
我会使用ValueError或其子类:“当内置操作或函数接收到具有正确类型但不适当值的参数时引发,并且情况不会被更精确的异常描述,例如IndexError“。
如果您认为所有参数都是单个元组,那么在需要2个时,传递3个或1个值在技术上是不合适的值...至少在我看来! :)
答案 5 :(得分:0)
我建议使用自定义异常。像这样:
class NeedExactlyTwo(ValueError):
pass
然后您可以在代码中raise NeedExactlyTwo
。
请务必在您的函数的docstring中记录此内容。