Я создал загрузочное приложение Spring со следующими слоями
- Контроллер
- BusinessLayer
- DAOImplLayer
Контроллер вызывает бизнес-уровень, а бизнес-уровень вызывает 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);
}
Я написал общий класс Handler для регистрации исключений.
@ExceptionHandler(BusinessException.class)
protected ResponseEntity<Object> handleEntityNotFound(BusinessException businessException)
{
if (null != businessException.getCause())
{
LOG.error("BusinessException: ", businessException);
}
some logic
}
Как сохранить исходную трассировку стека. Я ищу что-то похожее
Исключение в потоке "main" java.lang.ArithmeticException: / на ноль
на com.exception.copy.Layer3.getLayer3 (Layer3.java:8)
на com.exception.copy.Layer2.getLayer2 (Layer2.java:9)
at com.exception.copy.Layer1.main (Layer1.java:9)
Хорошо ли иметь собственное исключение для каждого слоя?