当异常包装在另一个自定义异常中并重新抛出时,如何保留原始堆栈跟踪

时间:2019-01-03 21:13:22

标签: java spring-boot exception exception-handling

我用以下几层创建了Spring Boot应用程序

  1. 控制器
  2. BusinessLayer
  3. DAOImplLayer

控制器调用业务层,业务层调用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
  }
  1. 如何保留原始堆栈跟踪。我正在寻找类似的东西

    线程“ 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)

  2. 在每个图层上都有一个自定义的异常好吗?

1 个答案:

答案 0 :(得分:0)

几乎每个 Exception 都允许您在构造函数中传递一个“原因”Exception,这样当您在 catch 块中抛出异常时,您可以像这样附加原始异常。

通常在记录或打印异常时,输出包含原始异常,并附加诸如“由:”之类的词。此外,当您捕获此类包装异常时,您可以调用 Throwable.getCause() 来检索导致当前异常的异常。

当然当你忘记在构造函数中添加原因时,原来的异常和真正的原因就丢失了。

在原始原因不会告诉用户出了什么问题的情况下,包装异常是一种常见的做法,因为消息和异常类型可能是低级的。