【问题标题】:IllegalArgumentException in service layer?服务层中的 IllegalArgumentException?
【发布时间】:2012-05-28 09:55:37
【问题描述】:

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

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

【问题讨论】:

  • 我的意见:定义你自己的不是 RuntimeException 子类的异常会更合适,因为你的异常是要在应用程序中捕获和处理的。

标签: java exception exception-handling service-layer


【解决方案1】:

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

但根据您的设计如何分配职责,服务层抛出IllegalArgumentException 可能非常有意义。从用例的角度来看,每当您处理用户输入时,您几乎都必须期待无效值并优雅地处理它们。它只是通过用例的一条替代路径,并且绝对会发生的事情,所以不是真正的错误。

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

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

希望这个的回答对你有帮助 -

【讨论】:

  • 感谢您的回答。我最终向服务添加了一个验证方法,该方法返回一个包含任何验证错误的字典。 Web 服务首先调用此验证方法来捕获用户的错误输入。那么任何进入服务方法的错误参数实际上都是编程错误,因此应该出现 IllegalArgumentException。
  • 乐于助人。不错的设计。它将允许您的组件之间的交互保持良好和干净,并保持交互运行顺畅。
猜你喜欢
  • 2013-04-07
  • 2012-05-11
  • 2014-02-05
  • 2017-06-07
  • 2013-05-16
  • 1970-01-01
  • 2014-02-13
  • 2012-01-30
  • 2019-05-06
相关资源
最近更新 更多