【问题标题】:Java Throwing exceptions vs returning response in catchJava抛出异常与catch中返回响应
【发布时间】:2013-05-29 18:53:22
【问题描述】:

我知道关于异常处理的讨论很多,但是我需要一些针对我的具体情况的建议。

我目前正在开发一个带有Controller->Services->DAO 层的Spring MVC 应用程序。服务类主要捕获HibernateExceptionIOException两种异常。

HibernateException 因为如果事务不成功,服务需要执行回滚,IOException 因为它是未经检查的异常,需要被捕获或抛出,我更喜欢第一个选项。

现在有什么更好的方法在堆栈中进一步处理这些问题:

  1. 我是否应该将这些异常重新抛出到控制器并在 控制器的ExceptionHandler 发送 HTTP 错误代码 500
  2. 或者在 catch 块中创建普通的JSON response 对象,设置status=failure 和相应的错误消息并将其返回给控制器?

【问题讨论】:

  • 你应该坚持你的观点 1。
  • IOException 在技术上不是未经检查的异常;什么意思?
  • 如果您无法以其他方式处理它们,我会捕获已检查的异常并重新将它们包装为自定义运行时异常。
  • 为什么不两者兼而有之?如果前端想让 JSON 报错,可以作为 500 return 的 body 返回。
  • 我个人使用@Transaction 注释并让它处理回滚并将Hibernate 异常排除在我的服务层之外。在我的服务层中没有说“休眠”。这样做我使用第二种方法,只返回一个 JSON 响应,详细说明正在发生的事情。

标签: java spring-mvc exception-handling


【解决方案1】:

异常处理约定:

有句话说,处理Exception最好的方法就是不去处理!

对于Springcontroller<->service<->dao 层约定,Exception 处理机制称为Bubble up。在daoservice 层出现任何异常,您应该将其弹出到controller 层(通过在dao 和服务层的方法签名中添加throws XXXException,是最常见的方式)。只有controller 层应该处理异常。

这是一个很好的教程,告诉你如何handle exceptions for REST with spring

发送 HTTP 状态码 500 或带有状态的 JSON 对象:

听起来您正在使用Spring MVC 编写 API。看,当您编写 API 时,您应该遵循正确的约定。全球公认,对于内部服务器错误,您发送带有代码 500 的 HTTP 响应,这意味着内部服务器错误。

在这种情况下,您不应发送 JSON 响应的原因有很多。主要原因之一是您的 API 客户端的隐含假设。那是带有代码200JSON 对象的HTTP 响应意味着一切正常。因此,客户端业务逻辑可能会反映最终错误的假设。

这里你可以看到一些知名组织的一些API错误代码约定:

【讨论】:

  • 感谢您富有洞察力的回复。我正在开发一个带有 jquery 客户端的 Spring MVC 应用程序,主要使用 ajax。我认为无论是 api 还是正确的错误处理对于在整个应用程序中保持一致都很重要。如果 web 服务执行成功发送 HTTP 响应 200 并且在异常情况下发送适当的 HTTP 错误响应代码,我将听从您的建议。
【解决方案2】:

我假设您还没有创建客户,因此可以为自己选择 100%。

如果是这样,我也建议使用 1,主要原因是使用正确的状态代码可以在您的 API 中大有帮助,而且它是解决您的问题的一个非常简单的方法。您可以为错误处理编写一些简洁的代码。 您应该使用第一点的另一个主要原因是,您可以轻松地将错误处理重用于其他 API、资源或 Web 应用程序。

例如一个包含所有错误的枚举,以及您认为它们是什么状态代码,您还可以包括您希望它们的日志级别。

public enum ExceptionMapping {
IllegalArgumentException(IllegalArgumentException.class, 400, LogLevel.ERROR),

如果您的目标是为未知客户端构建一个简洁的 API,我建议您阅读有关 REST 级别 3 (http://martinfowler.com/articles/richardsonMaturityModel.html) 的更多信息,其中包含超媒体链接以创建允许客户端“浏览”您的完整 API 的 API。客户端需要做更多的工作,因为它们必须更聪明,但它可以为您提供非常好的功能,例如在客户端甚至没有注意到的情况下破坏大部分 API。

【讨论】:

  • +1 以获得有见地的链接。我已经在开发一个 jquery 客户端,但是仍然可以进行更改,因为我是单独在服务器和客户端上工作的。
猜你喜欢
  • 1970-01-01
  • 2016-12-11
  • 2010-11-09
  • 2013-06-09
  • 2012-06-27
  • 2013-08-07
  • 2021-01-12
  • 1970-01-01
  • 2011-03-28
相关资源
最近更新 更多