我应该何时使用InvalidArgumentException和何时UnexpectedValueException?他们看起来和我一样。
Note一个扩展了LogicException而另一个扩展了RuntimeException,所以区别不应该是如此微妙的IMO。
答案 0 :(得分:28)
仔细查看手册页上的说明:
如果参数与预期类型不匹配,则抛出异常。
(注意:“type”在手册页上最初是“value”,这使得它更多地是验证而不是类型检查,并且更接近地匹配UnexpectedValueException的术语。)
如果值与一组值不匹配,则抛出异常。通常,当函数调用另一个函数时,会发生这种情况,并且期望返回值是某种类型或值[,]不包括与算术或缓冲区相关的错误。
由此可以得出结论:InvalidArgumentException
用于传递给函数的参数,而UnexpectedValueException
用于在函数内部计算期间出现的值(例如,从其他函数返回的值) )。
答案 1 :(得分:14)
我的理解是,如果您针对固定的可能值范围列表检查参数,则应使用InvalidArgumentException
,即LogicException
。例如,检查用户输入的数据是否仅包含数字。可以期望程序 logic 处理这些值范围。
UnexpectedValueException
,作为RuntimeException
(错误,只能在运行时找到/在编译时无法检测到),将用于外部发生的异常可预见和指定的输入范围(可能是上述“逻辑”检查后的最后手段)。
回答此问题的关键可能是Unexpected...
中的UnexpectedValueException
。 Unexpected
表示程序逻辑中没有处理此值。另一方面,Invalid
表明已经处理了这个值。