我用以下几层创建了Spring Boot应用程序
控制器调用业务层,业务层调用DAOImplLayer。我创建了两个不同的自定义异常(BusinessException和DAOException)
在DAOImpl类中,我正在捕获DataAccessException并引发DAOException(由于SonarQube抱怨日志或重新抛出DataAccessException异常,因此在参数中带有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) 在com.exception.copy.Layer1.main(Layer1.java:9)
在每个图层上都有一个自定义的异常好吗?
答案 0 :(得分:0)
几乎每个 Exception
都允许您在构造函数中传递一个“原因”Exception
,这样当您在 catch 块中抛出异常时,您可以像这样附加原始异常。>
通常在记录或打印异常时,输出包含原始异常,并附加诸如“由:”之类的词。此外,当您捕获此类包装异常时,您可以调用 Throwable.getCause()
来检索导致当前异常的异常。
当然当你忘记在构造函数中添加原因时,原来的异常和真正的原因就丢失了。
在原始原因不会告诉用户出了什么问题的情况下,包装异常是一种常见的做法,因为消息和异常类型可能是低级的。