在Java中,使用抛出异常而不是抛出多个特定的异常是好的做法吗?

2022-09-03 08:36:01

在浏览Spring MVC框架时,我注意到,除非我误解了,否则它的开发人员更喜欢抛出异常,而不是抛出多个异常。

我意识到,这个问题的核心是检查与不受检查的例外辩论,避免宗教战争,使用抛出通用异常是一种好的做法吗?


答案 1

不,绝对不是。您应该指定要引发的异常,以便调用方可以对每个异常执行正确的操作。如果你不这样做,“throws Exception”就会在链上传递,调用者能做的最好的事情就是printStackTrace()和die。

更新:为了反驳一些“如果我重写方法怎么办”的反对意见,我会更进一步说,每当你有一个抛出异常的包(而不是从调用方传递异常)时,你应该在该包中声明一个异常类。因此,如果你正在覆盖我的“addToSchedule()抛出SchendmentConflictException”,你完全能够子类SchendmentConflictException来做你需要的事情。


答案 2

对于像Spring MVC这样的库来说,什么是有意义的,它需要足够开放以适应各种不同的用例,但在编写特定应用程序时,你不一定有意义。这是其中一种情况。

如果您引用的类,例如作为方法签名的接口,例如Controller

handleRequest(HttpServletRequest request, HttpServletResponse response) 
   throws Exception

这可能是因为,从调用控制器(例如)的Spring类的角度来看,他们并不关心您的代码调用哪种类型的异常 - 库代码(例如只需要知道该类可能会引发异常,因此能够在一般情况下处理异常。DispatcherServletDispatcherServlet

换句话说,不需要知道控制器可能引发哪些特定类型的异常 - 它会将其中任何一个视为“错误”。这就是方法签名是 .DispatcherServletthrows Exception

现在,API 作者本可以使签名使用自定义异常类型作为 ,但这只会强制您在方法中处理任何已检查的异常类型,并简单地包装它们,这是繁琐的 make-work 样板代码。因此,由于Spring的几乎所有内容都旨在使您尽可能轻松,轻松地集成,因此他们更容易指定接口方法。SpringMvcExceptionhandleRequestthrows Exception


推荐