Cho*_*per 38 php spl exception
我什么时候应该使用InvalidArgumentException和UnexpectedValueException?他们看起来和我一样.
请注意,一个扩展了LogicException,另一个扩展了RuntimeException,因此差异不应该是如此微妙的IMO.
out*_*tis 28
仔细查看手册页上的说明:
如果参数与预期类型不匹配,则抛出异常.
(注意:"type"在手册页上最初是"value",这使得它更多地是验证而不是类型检查,并且更接近地匹配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另一方面,表明已经处理了这个值.