首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Spring中处理异常的推荐方法是什么

在Spring中处理异常的推荐方法是什么
EN

Software Engineering用户
提问于 2016-06-23 16:47:20
回答 2查看 24.7K关注 0票数 5

我有一个Spring应用程序,在这个应用程序中,我们很少调用服务来获取数据。控制器和服务层之间有一个数据层。

代码语言:javascript
复制
Controller (Request-Mapping) -> Data Layer -> Service Layer

如果我们没有从底层服务获得数据,我们打算抛出一个异常。我的问题是关于在此采用的最佳做法:

  1. 我应该让DataProvider (数据层)和控制器抛出异常并让tomcat通过web.xml处理它吗?
  2. 我是否应该捕获数据层本身中的异常,记录它,而不将异常传播给Controller?

具体来说,将控制器标记为“抛出CustomException”是一件好事吗?

EN

回答 2

Software Engineering用户

回答已采纳

发布于 2016-09-17 17:09:35

与抛出Controller处理程序方法异常的观点相反,我确实建议这样做。原因如下:

  1. 它消除了很多样板代码。控制器中几乎所有的尝试捕获都是相同的,并且经常从一个地方复制粘贴到另一个地方。它增加了代码维护的负担,增加了控制器和异常层次之间的耦合。
  2. 还有其他方法可以正确地处理异常。最好的解决方案是拥有一个全局异常处理程序,它将特定类型的异常转换为HTTP响应代码。例如,当数据库查询或远程调用由于超时而失败时,可以将其转换为HTTP 503。当存储库抛出ObjectNotFoundException时,可以返回HTTP404。当验证失败时,请使用HTTP 400响应。在很少的特定情况下,您也可以拥有特定于控制器的处理程序(各种罕见的情况)。

也就是说,这并不意味着您应该在方法签名中“抛出异常”。在分层体系结构中,像控制器这样的高层对象不能期望低级别的异常(例如来自JDBC驱动程序的异常),因为它会违反封装。每个层应该有单独的异常层次结构,它具有特定于该层的语义,并且应该有异常转换(通常通过包装完成)。例如,存储库中的ConstraintViolationException可能导致服务中的InvalidServiceRequestException,并由异常处理程序转换为HTTP400。

票数 7
EN

Software Engineering用户

发布于 2016-06-24 05:25:53

在可能的情况下,您可以使用@ResponseStatus、@ExceptionHandler、@ControllerAdvice注释在控制器方法中显式地处理异常。有关更多细节,请参阅:弹簧中的异常处理

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/323091

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档