4

我知道围绕异常处理进行了很多讨论,但是我需要一些针对我的情况的建议。

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

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

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

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

2 回答 2

9

异常处理约定:

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

对于Springcontroller<->service<->dao层约定,Exception处理机制称为Bubble updaoor层出现任何异常service,都应该弹出到该controller层(通过添加throws XXXExceptiondao和service层的方法签名,是最常用的方式)。只有controller层应该处理异常。

这是一个很好的教程,介绍了如何使用 spring 处理 REST 异常

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

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

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

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

于 2013-06-03T15:28:06.203 回答
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。客户端需要做更多的工作,因为它们必须更聪明,但它可以为您提供非常好的功能,例如在客户端甚至没有注意到的情况下破坏大部分 API。

于 2013-06-03T15:27:06.690 回答