InvalidArgumentException与UnexpectedValueException

Cho*_*per 38 php spl exception

我什么时候应该使用InvalidArgumentExceptionUnexpectedValueException?他们看起来和我一样.

请注意,一个扩展了LogicException,另一个扩展了RuntimeException,因此差异不应该是如此微妙的IMO.

out*_*tis 28

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

InvalidArgumentException:

如果参数与预期类型不匹配,则抛出异常.

(注意:"type"在手册页上最初是"value",这使得它更多地是验证而不是类型检查,并且更接近地匹配UnexpectedValueException的术语.)

UnexpectedValueException:

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

由此,我们可以得出结论,Exception thrown if an argument does not match with the expected value.它用于传递给函数的参数,而InvalidArgumentException用于在函数的内部计算期间出现的值(例如,从其他函数返回的值).


bar*_*aij 17

我猜最大的区别是"论证"与"价值".

我看到它的方式InvalidArgumentException是(传递)参数,而UnexpectedValueException适用于(返回)."无效"和"意外"之间存在微妙但重要的区别 - 这也解释了为什么第一个是LogicException而第二个是RuntimeException.

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

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

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

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

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

我不能说这个值是"无效的" - 我问了一个字符串,我得到了一个字符串.但它不是我期待的那种"字符串":因此意外的 ValueException.

希望这可以解决一些问题.这是我的第一篇文章 - 到目前为止,我已经知道写下我脑子里的东西并不是最简单的事情(英语也不是我的母语).


ax.*_*ax. 14

我的理解是InvalidArgumentException,作为一个LogicException,应该,如果你对检查可能的值范围的固定列表中的参数一起使用.例如,检查用户输入的数据是否仅包含数字.可以期望程序逻辑处理这些值范围.

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

回答这个问题的关键可能Unexpected...在于UnexpectedValueException.Unexpected表示程序逻辑中没有处理此值.Invalid另一方面,表明已经处理了这个值.

  • +1.我通常发现自己在`switch`语句的`default`情况下使用`UnexpectedValueExpection`(例如对于FSM中的状态),它应该处理一组有限的可能值. (3认同)