【发布时间】:2020-04-08 11:57:01
【问题描述】:
在缺少正确执行函数的值的情况下,应该使用哪个标准 Python 异常(如果有)? TypeError 和 ValueError 对我来说似乎是不错的候选人,但根据文档(我的斜体):
传递错误类型的参数(例如,当需要
int时传递list)应该会导致TypeError,但是传递具有错误值的参数(例如,超出预期边界的数字)会导致ValueError。ValueError :当操作或函数接收到具有正确类型但值不适当的参数时引发,并且这种情况没有通过更精确的异常来描述,例如作为索引错误。
在我看来,这些描述都没有完全捕捉到缺失值的概念。但标准中的其他例外似乎也没有一个更接近。
这是一个例子。 myclass 类型的对象可以用两种不同的方式实例化,每种方式都需要一个特定的参数。如果两者都没有提供,则初始化失败。
class myclass(object):
def __init__(self,firstparam=None,secondparam=None):
if firstparam:
self.firstinit()
elif secondparam:
self.secondinit()
else:
#What to put here ?
raise Exception("Missing value for myclass")
if __name__=="__main__":
#oops, forgot to specify a parameter here !
myobj=myclass()
当然,我知道在编写库时我总是可以实现自己的MissingValueError 异常子类。我问这个问题是为了不重复标准中可能已经存在的东西。
【问题讨论】:
-
我不认为 Python 标准异常具体涵盖了这种情况,因为它是一个非常特定于场景的情况。如果我是你,我会创建自己的异常以在构造对象时抛出,或者坚持使用通用的
Exception类。 -
@dddJewelsbbb 真的是这样的场景特定情况吗?我给出的例子当然非常具体,但是缺失值的概念似乎适用于各种情况。
-
@DanD。我认为这是对 valueerror 的滥用。 docs.python.org/3/library/exceptions.html#ValueError 明确指出它适用于“正确类型”的值。您无法检查缺失值的类型。
-
为了清楚起见,我对两者的区别在于,当您提供多个默认参数,并且您正在检查至少一个是非 Falsy 或至少不是默认参数时,你的例外不是你提供了错误的类型,而是你没有得到至少一种足够的类型,我认为这是两者之间非常微妙但有效的区别使得这是一个“特定场景”。
-
不过想了想,这大概是一个角度的问题吧。如果我们担心抛出“正确的”异常,我仍然认为这应该是一个自定义异常,但如果您必须冒泡一个特定的 Python 异常,我会支持@lenik最合适的应该是
TypeError,只要你不期望一个虚假的值。