2

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

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

4

1 回答 1

2

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

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

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

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

希望这个答案有帮助-

于 2012-05-22T02:36:43.960 回答