Abh*_*kar 4 java exception illegalargumentexception illegalstateexception
让我们从Javadocs开始:
表示在非法或不适当的时间调用了方法.换句话说,Java环境或Java应用程序未处于所请求操作的适当状态.
抛出以指示方法已被传递非法或不适当的参数.
上述问题是它们非常黑白.考虑一种方法,其中方法正在解析调用者提供的文件.该文件存在,可读,格式正确.但是,文件中的某些内容不符合业务规则.在这种情况下抛出什么是适当的例外 - IllegalStateException或者IllegalArgumentException?
查看提供断言的各种库,例如Guava Preconditions或Spring Assert,似乎没有达成共识.这里和这里有一些很好的讨论,但没有一个能为我上面提到的常见用例提供确凿的答案.
免责声明:据我所知,我没有展示一些代码,但我认为这是一个特殊而实用的问题,需要考虑进行良好的API设计.让我们假装我们回到了堆栈溢出的好日子,当时人们乐于讨论实用问题,而不是贬低任何看起来不像家庭作业的东西.
小智 6
换句话说:
如果接受类型而不是值,则抛出IllegalArgumentException,例如期望正数并给出负数.
调用方法时抛出IllegalStateException,不应该调用方法,就像从死线程调用方法一样.
我不知道它们如何混合.在关于有问题的文件的问题中,我认为抛出ParseException或IOException会更合适.
IllegalStateException用于编码错误,而不是输入错误。它适用于违反类的不变量或在对象处于错误状态时调用方法的情况。示例包括使用已关闭的资源或关闭资源两次。
IllegalArgumentException根据方法 API,参数具有无效值。当只允许正数时传递 -1。
在这种情况下,两种例外都不合适。我会创建一个子类,IOException因为输入文件中有错误。
其他答案突出显示何时使用IllegalArgumentException或IllegalStateException。但在我看来(注意:基于意见)这些异常不应该在您的用例中使用。
总结:某些文件包含有效格式的数据,已成功加载到应用程序中,但某些值不符合您的业务规则(注意:没有 IO 操作失败,格式有效 => 既不IOException也不ParseException应该使用,它们表明IO 操作失败或格式无效)。
IllegalArgumentException?抛出此异常表示方法已传递了非法或不适当的参数。您可能会争辩说,您有一种验证文件的方法,并且该文件中某个字段的值或多个字段的值的组合是非法的或不符合您的业务规则。是的,指向你。但是,如果您IllegalArgumentException在这种情况下抛出IllegalArgumentExceptions,则无法将其他库(或标准库或您自己其他地方的代码)引起的IllegalArgumentExceptions 与验证器中的s分开,这很容易表明违反业务规则(当然,您可以子类化 IAE并在调用方法中捕获它)。
为什么要分离这些异常?用例:应向用户显示违反业务规则的情况,以便他可以更改不合规的输入。例如,其他 IAE 或任何未捕获的运行时异常表示请求在服务器上失败。在这些情况下,您必须向客户端发送不同的响应。
您可以用类似的方式论证为什么IllegalStateException不应该使用 s 来指示违反业务规则的情况。那么,在您的用例中应该使用什么?这在很大程度上取决于您的应用程序的规模。一些自定义子类RuntimeException可能会为小型应用程序完成工作。对于较大的应用程序验证库,如“javax.validation”值得一试。
| 归档时间: |
|
| 查看次数: |
5180 次 |
| 最近记录: |