java - 服务层中的IllegalArgumentException?

标签 java exception service-layer

据我了解,IllegalArgumentException 旨在传达编程错误。

如果我正在编写一个本质上通过 Web 服务接受用户输入的服务层,如果 Web 服务传入客户端提供的非法参数,则 IllegalArgumentException NOT 是合适的,因为这实际上不是一个编程错误?创建我自己的服务级别异常(exception)会更好吗?

最佳答案

是的,应该使用RuntimeException(以及扩展后的IllegalArgumentException)来明确发生了编程错误或其他意外或不正确的操作。它应该发出警报,表明已发现错误,应该通过测试进行纠正和验证。

但是根据您的设计如何分配职责,服务层抛出 IllegalArgumentException 可能是完全有意义的。从用例的角度来看,任何时候处理用户输入时,您几乎都必须预料到无效值并妥善处理它们。它只是用例的替代路径,并且是绝对会发生的事情,所以并不是真正的错误。

但是处理无效的用户输入通常是用户界面的责任,因此网页应该优雅地处理错误的输入,并为用户提供纠正的机会(在登录尝试期间输入错误输入的密码) , 例如)。但由于这是预期的,所以这并不是一个异常(exception)。关键是,如果用户界面在发送请求之前能够确保有效性,则不应向服务器发送无效请求。如果这在用户界面中是可能的,那么服务层抛出 IllegalArgumentException 就有意义了。

回到用户登录的例子,用户界面只能确保输入的数据格式正确;它完全无法保证这些值实际上是正确的。因此,用户界面必须将格式正确的输入发送到服务层。在这种情况下,我不会从服务层抛出异常,因为格式正确但值不正确是预料之中的情况。在这种情况下,如果用户界面发送的值格式不正确,我会抛出异常,但如果值只是不正确,则不会抛出异常。在第二种情况下,我会回复用户界面说这些值不正确,但我不会抛出异常。

希望这个答案对您有所帮助 -

关于java - 服务层中的IllegalArgumentException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10693045/

相关文章:

c# - Controller 和服务层之间的接口(interface)

java - JBoss6 与 RestEasy 客户端

python - python如何重新引发已经捕获的异常?

c++ - URI 错误时如何处理 StorageFile::OpenAsync 的异常

django:当 debug = False 时显示数据库错误

entity-framework - Linq-to-SQL 和 Entity Framework 在同一个项目中?

java - UnsatisfiedLinkError:库已加载,但我仍然收到链接错误

java - Retrofit.RetrofitError 请求网络执行过程中出现异常 : null

java - 让 Java 代码更加通用

c# - 服务和服务层