首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvalidArgumentException vs UnexpectedValueException

InvalidArgumentException vs UnexpectedValueException
EN

Stack Overflow用户
提问于 2012-09-19 03:28:40
回答 2查看 12.8K关注 0票数 41

什么时候应该使用InvalidArgumentException,什么时候使用UnexpectedValueException?它们在我看来是一样的。

一个Note扩展了LogicException,另一个扩展了RuntimeException,所以区别不应该那么微妙。

EN

回答 2

Stack Overflow用户

发布于 2012-09-19 07:05:23

我想最大的区别是“参数”和“值”。

在我看来,InvalidArgumentException用于(传递的)参数,而UnexpectedValueException适用于(返回的)值。此外,“无效”和“意想不到”之间有一个细微但重要的区别--这也解释了为什么第一个是LogicException,第二个是RuntimeException。

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

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

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

因此,这一次我使用(有效的) user-id调用我的函数,并且我的函数获得该用户的最后一条消息的日期。有了这个日期,我想做一些事情,比如格式化。

现在想象一下Twitter的人做错了什么,我得到的不是我期望的yyyy-mm-dd日期字符串,而是一个空字符串或另一个字符串“blaaaa”。此时,我可以抛出一个UnexpectedValueException

我不能说这个值是“无效的”--我请求了一个字符串,结果得到了一个字符串。但这并不是我所期望的“字符串类型”:因此 ValueException意想不到。

希望这能澄清一些事情。这是我的第一篇博文--到目前为止,我明白了写下我脑海中的东西并不是一件容易的事情(英语也不是我的母语)。

票数 19
EN

Stack Overflow用户

发布于 2012-09-19 05:30:30

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

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

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

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12483667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档