InvalidArgumentException与UnexpectedValueException

时间:2012-09-18 19:28:40

标签: php exception spl

我应该何时使用InvalidArgumentException和何时UnexpectedValueException?他们看起来和我一样。

Note一个扩展了LogicException而另一个扩展了RuntimeException,所以区别不应该是如此微妙的IMO。

2 个答案:

答案 0 :(得分:28)

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

InvalidArgumentException:

  

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

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

UnexpectedValueException:

  

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

由此可以得出结论:InvalidArgumentException用于传递给函数的参数,而UnexpectedValueException用于在函数内部计算期间出现的值(例如,从其他函数返回的值) )。

答案 1 :(得分:14)

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

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

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