Java抛出异常与返回catch中的响应

use*_*448 4 java exception-handling spring-mvc

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

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

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

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

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

Saz*_*man 9

异常处理协议:

有一种说法,处理异常的最佳方法是不处理它!

对于层Spring的约定controller<->service<->dao,Exception处理机制被称为Bubble up.在层daoservice层中发生任何异常,您应该将其弹出到controller图层(通过添加throws XXXExceptiondao和服务层的方法签名,这是最常用的方式).只有controller图层才能处理异常.

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

发送状态为的HTTP状态代码500或JSON对象:

听起来像是在编写API Spring MVC.看,当你编写API时,你应该遵循适当的约定.全局接受的是,对于内部服务器错误,您使用代码发送HTTP响应500,这意味着内部服务器错误.

JSON在这种情况下,您不应该发送响应的原因有多种.其中一个主要原因是您的API客户端的隐含假设.这是200带有JSON对象代码的HTTP响应意味着每件事情都正常.因此,客户端业务逻辑可能最终反映出错误的假设.

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