Java 服务层中的IllegalArgumentException?

Java 服务层中的IllegalArgumentException?,java,exception,exception-handling,service-layer,Java,Exception,Exception Handling,Service Layer,据我所知,IllegalArgumentException用于传递编程错误 如果我编写的服务层本质上是通过web服务接受用户输入的,那么如果web服务传入客户端提供的非法参数,那么IllegalArgumentException将不合适,因为这实际上不是一个编程错误?创建自己的服务级别异常是否更好 是的,应该使用运行时异常(扩展为IllegalArgumentException)来明确发生了编程错误或其他一些意外或不正确的操作。它应该发出一个警报,指出一个bug已经被发现,这应该通过测试来纠正和

据我所知,IllegalArgumentException用于传递编程错误


如果我编写的服务层本质上是通过web服务接受用户输入的,那么如果web服务传入客户端提供的非法参数,那么IllegalArgumentException将不合适,因为这实际上不是一个编程错误?创建自己的服务级别异常是否更好

是的,应该使用
运行时异常
(扩展为
IllegalArgumentException
)来明确发生了编程错误或其他一些意外或不正确的操作。它应该发出一个警报,指出一个bug已经被发现,这应该通过测试来纠正和验证

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

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

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


希望这个冗长的回答有帮助-

我的意见是:定义您自己的异常更合适,它不是RuntimeException的子类,因为您的异常是要在应用程序中捕获和处理的异常。谢谢您的回答。最后,我向服务添加了一个验证方法,该方法返回一个带有任何验证错误的字典。web服务首先调用此验证方法以捕获用户的错误输入。那么,任何进入服务方法的坏参数实际上都是编程错误,因此应该得到IllegalArgumentException。乐意帮助。好设计。它将允许组件之间的交互保持良好和干净,并保持交互平稳运行。