【发布时间】:2019-01-03 21:13:22
【问题描述】:
我已经创建了具有以下层的 Spring Boot 应用程序
- 控制器
- 业务层
- DAOImplLayer
Controller 调用业务层,业务层调用 DAOImplLayer。我创建了两个不同的自定义异常(BusinessException 和 DAOException)
在 DAOImpl 类中,我正在捕获 DataAccessException 并抛出 DAOException(参数中有 dataAccessException 对象,因为 SonarQube 抱怨要么记录或重新抛出 DataAccessException 异常。)
catch (DataAccessException dataAccessException)
{
throw new DAOException(dataAccessException, INTERNAL_SERVER_ERROR, CODE_INTERNAL_SERVER,
dataAccessException.getCause().getMessage());
}
在 BusinessImpl 中,我正在捕获 DAOException 并抛出 BusinessException
catch (SecurityDAOException e)
{
some logic
throw new BusinessException(e, e.type, e.code, UNABLE_TO_PROCESS_REQUEST);
}
我已经编写了通用的处理程序类来记录异常。
@ExceptionHandler(BusinessException.class)
protected ResponseEntity<Object> handleEntityNotFound(BusinessException businessException)
{
if (null != businessException.getCause())
{
LOG.error("BusinessException: ", businessException);
}
some logic
}
-
如何保留原始堆栈跟踪。我正在寻找类似的东西
线程“主”java.lang.ArithmeticException 中的异常:/ 为零 在 com.exception.copy.Layer3.getLayer3(Layer3.java:8) 在 com.exception.copy.Layer2.getLayer2(Layer2.java:9) 在 com.exception.copy.Layer1.main(Layer1.java:9)
可以为每一层自定义异常吗?
【问题讨论】:
-
应该只抛出一个异常并在异常处理程序中获取它。看起来没有有用的双重异常包装
-
@JonathanJohx:我不明白你的评论想说什么。想用普通的英语重写它吗?
-
好的,他应该让异常被抛出而不是包装在一个新的异常中。他的拦截尝试和接球没有用,因为他又在扔了。然后他应该重写BusinessException.class的异常处理程序为SecurityDAOException.class @ruakh
标签: java spring-boot exception exception-handling