【问题标题】:How to preserve the original stack trace when exception is wrapped in another custom exception and rethrown当异常包装在另一个自定义异常中并重新抛出时如何保留原始堆栈跟踪
【发布时间】:2019-01-03 21:13:22
【问题描述】:

我已经创建了具有以下层的 Spring Boot 应用程序

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

    线程“主”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. 可以为每一层自定义异常吗?

【问题讨论】:

  • 应该只抛出一个异常并在异常处理程序中获取它。看起来没有有用的双重异常包装
  • @JonathanJohx:我不明白你的评论想说什么。想用普通的英语重写它吗?
  • 好的,他应该让异常被抛出而不是包装在一个新的异常中。他的拦截尝试和接球没有用,因为他又在扔了。然后他应该重写BusinessException.class的异常处理程序为SecurityDAOException.class @ruakh

标签: java spring-boot exception exception-handling


【解决方案1】:

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

通常在记录或打印异常时,输出包含原始异常,并附加诸如“引起:”之类的词。另外,当你捕获到这样一个被包装的异常时,你可以调用Throwable.getCause() 来检索导致当前异常的异常。

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

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

【讨论】:

    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-02
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    相关资源
    最近更新 更多