我知道有很多关于异常处理的讨论,但我需要一些针对我的情况的建议。
我目前正在处理Spring MVC
个Controller->Services->DAO
层的应用程序。服务类主要捕获两种异常HibernateException
和IOException
。
HibernateException
因为服务需要在事务未成功时执行回滚而IOException
因为它是未经检查的异常而需要被捕获或抛出而我更喜欢第一个选项。
现在在堆栈中进一步处理这些更好的方法是什么:
ExceptionHandler
发送HTTP错误代码500 JSON response
对象,设置status=failure
和相应的错误消息并将其返回给Controller?答案 0 :(得分:9)
异常处理文件:
有一种说法,处理异常的最佳方法是不处理它!
对于Spring
controller<->service<->dao
层的约定,Exception
处理机制称为Bubble up
。在dao
或service
图层中发生任何异常,您应该将其弹出到controller
图层(通过在dao和服务图层的方法签名中添加throws XXXException
,是最多的一般的方法)。只有controller
图层才能处理异常。
这是一个很好的教程,说明如何handle exceptions for REST with spring。
发送状态为
的HTTP状态代码500或JSON对象听起来您正在使用Spring MVC
编写API。看,当你编写API时,你应该遵循适当的约定。全局接受的是,对于内部服务器错误,您发送代码为500
的HTTP响应,这意味着内部服务器错误。
在这种情况下,您应该发送JSON
响应的原因有多种。其中一个主要原因是您的API客户端的隐含假设。这是带有200
对象的代码JSON
的HTTP响应意味着每件事情都正常。因此,客户端业务逻辑可能反映出最终错误的假设。
在这里,您可以看到一些知名组织的API
错误代码约定:
答案 1 :(得分: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。