41

我应该何时使用InvalidArgumentException以及何时使用UnexpectedValueException?它们在我看来是一样的。

请注意,一个扩展了 LogicException,另一个扩展了 RuntimeException,因此 IMO 的区别不应该那么细微。

4

3 回答 3

31

仔细查看手册页上的描述:

无效参数异常

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

(描述Exception thrown if an argument does not match with the expected value. 直到 2014 年年中,但在 PHP 5.6 引入时发生了变化)

意外值异常

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

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

请注意,检查参数的值是一种灰色区域;可以说,因为InvalidArgumentException extends LogicException,它应该只处理这样的情况,should lead directly to a fix in your code.因为在超出范围的输入值的情况下抛出异常可能是完全预期的运行时行为,所以在这种情况下,这使得UnexpectedValueException(扩展RuntimeException)成为唯一的候选者。

于 2012-10-26T23:14:42.267 回答
19

我想最大的区别是“论据”与“价值”。

我看到的方式InvalidArgumentException是 for (passed) arguments,而UnexpectedValueException适用于 (returned) values。“无效”和“意外”之间还有一个微妙但重要的区别——这也解释了为什么第一个是 LogicException 而第二个是 RuntimeException。

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

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

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

所以,这次我用(有效的)用户 ID 调用我的函数,我的函数获取该用户最后一条消息的日期。有了这个日期,我想做一些事情,比如一些格式。

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

我不能说这个值是“无效的”——我要求一个字符串,我得到了一个字符串。但它不是我所期待的“字符串类型”:因此出现意外的 ValueException。

希望这可以解决问题。这是我的第一篇文章——到目前为止,我了解到写下我脑海中的想法并不是最简单的事情(英语也不是我的母语)。

于 2012-09-18T23:05:22.887 回答
15

我的理解是,InvalidArgumentException如果LogicException您根据可能值范围的固定列表检查参数,则应该使用 , 。例如,检查用户输入的数据是否仅包含数字。程序逻辑可以处理这些值范围。

UnexpectedValueException,作为一个RuntimeException只能在运行时发现/无法在编译时检测到的错误),将用于发生在可预见和指定输入范围之外的异常(可能作为上述“逻辑”检查后的最后手段)。

回答这个问题的关键可能是Unexpected...UnexpectedValueException. Unexpected意味着在程序逻辑中没有处理这个值。Invalid,另一方面,表明该值已被处理。

于 2012-09-18T21:30:29.500 回答