我正在开发一个具有DAO,服务,控制器,视图层的Spring Web应用程序。 JPA用于数据库访问。我用于JPA异常处理的方法如下所示。
public class DBException extends RuntimeException {
implemented constructors to call appropriate RuntimeException constructors.
}
public MyDAOClass {
public void save(Object object) {
try {
entityManager.persist(object);
}catch(PersistenceException e) {
throw new DBException("Error occurred in save", e);
}
}
}
public class MyServiceClass {
public void serviceMethod() {
dao.save(object);
}
}
public class MyRestController {
public void controllerMethod() {
service.save();
}
@ExceptionHandler(DBException.class)
public String handleDBException(DBException e, HttpServletRequest req) {
implemented code to log & handle exception.
}
}
我想在异常中获得更多信息,这是创建自定义DBException的原因,而且我也不想将PersistenceException传播到其他层。
这是处理异常的正确方法吗?
我应该在所有图层中记录异常,还是在控制器末端记录异常?
我正在抓住PersistenceException
并重新抛出DBException
。由于DBException
是RuntimeException
,我认为spring事务应该在异常情况下回滚吗?
感谢。
答案 0 :(得分:0)
这是处理异常的正确方法吗?
是的,您不应该将特定于图层的异常传播到其上方的图层。如果您希望数据层的客户端从异常中恢复,那么创建一个新的自定义检查异常并从save方法中的catch块中抛出它。
我应该在所有图层中记录异常还是在最后记录它 控制器好吗?
只能在一个地方进行日志记录,因为在多个级别进行日志记录会使程序员检查堆栈跟踪有关原始异常源的信息。在这种情况下,我认为最好在save方法的catch块中记录SQLException,因为你重新抛出RuntimeException,save方法的调用者可能不一定捕获异常并记录它。
我正在捕获PersistenceException并重新抛出DBException。以来 DBException是一个RuntimeException我认为spring transaction应该是 在发生异常时回滚?
是的,在RuntimeException的情况下,Spring事务回滚。这是因为在RuntimeException的情况下调用者代码不能做太多,因为它代表不可恢复的条件。此行为在Docs中定义。
有关异常处理的最佳做法的更多信息here