InvalidArgumentException vs UnexpectedValueException

2022-08-30 11:41:40

我什么时候应该使用 InvalidArgumentException,什么时候应该使用 UnexpectedValueException?它们在我看来是一样的。

请注意,一个扩展了LogicException,另一个扩展了 RuntimeException,所以差异不应该是那么微妙的 IMO。


答案 1

仔细查看手册页上的说明:

InvalidArgumentException

如果参数不是预期类型,则引发异常。

(描述为“如果参数与预期值不匹配,则引发异常”。直到2014年年中,但在PHP 5.6推出时发生了变化)

意外值异常

如果值与一组值不匹配,则引发异常。通常,当一个函数调用另一个函数并期望返回值是某种类型或值[,]不包括与算术或缓冲区相关的错误时,就会发生这种情况。

由此,我们可以得出结论,其目的是检查传递给函数的参数类型,同时旨在验证值与有效值集,可能在函数的内部计算期间(例如,从其他函数返回的值)。InvalidArgumentExceptionUnexpectedValueException

请注意,检查参数的值在这里是一种灰色地带;可以说,因为,它应该只处理应该直接导致代码修复的情况。由于在超出范围的输入值的情况下引发异常可能是完全预期的运行时行为,因此在这种情况下,这将使(扩展)成为唯一的候选者。InvalidArgumentException extends LogicExceptionUnexpectedValueExceptionRuntimeException


答案 2

我想最大的区别是“参数”与“价值”。

我看到的方式是用于(传递的)参数,而适用于(返回的)。此外,“无效”和“意外”之间还有一个微妙但重要的区别 - 这也解释了为什么第一个是LogicException,第二个是Run runtimeException。InvalidArgumentExceptionUnexpectedValueException

例如:假设我有一个利用Twitter-api的函数,名为::你传递一个(数字)user-id,它将该用户的最后一条消息的日期作为yy-mm-dd字符串返回。getLastMessageDate($userid)

现在,假设我用字符串作为参数而不是数字来调用此函数。此时,我可以调用 InvalidArgumentException,因为提供的参数对于此函数无效。这些检查可以通过逻辑完成 - 因为变量要么是数字,要么不是。因此,它是一个LogicException。

但是,函数的返回值可能无法通过逻辑进行验证 - 尤其是在处理(第三方)动态内容时。因为你永远无法确切地知道你的函数将返回什么。(如果你愿意,这可以说会使你的函数变得毫无用处。

因此,这次我使用(有效的)user-id 调用我的函数,我的函数获取该用户最后一条消息的日期。有了这个日期,我想做一些事情,比如一些格式化。

现在想象一下,Twitter的家伙做错了什么,而不是我预期的yyyy-mm-dd日期字符串,我得到一个空字符串或另一个字符串说“blaaaa”。在这一点上,我可以抛出一个.UnexpectedValueException

我不能说这个值是“无效的” - 我要求一个字符串,我得到了一个字符串。但是,它不是我所期望的“字符串类型”:因此意外值异常。

希望这能澄清一些事情。这是我的第一篇文章 - 到目前为止,我已经了解到写下我脑海中的东西并不是最简单的事情(英语也不是我的母语)。


推荐