【问题标题】:Multiple Java root causes to an exception一个异常的多个 Java 根本原因
【发布时间】:2013-04-03 00:11:24
【问题描述】:

我有一个有趣的场景,我在 catch 子句中设置了一个 HttpServletResponse 错误。 “response.sendError(..)”也会引发异常。在异常处理期间处理异常以保留原始异常细节的最佳方法是什么?

我有这样的事情:

try {
...
} catch(Exception e) {
  try {
      response.sendError(500);
    } catch(IOException e2) {
      //Can I do something like:
      //'throw new ServletException(e,e2)' here?
    }
}

换句话说,将两个异常中的信息捆绑到下一个抛出的异常中的最佳方法是什么?我不想在处理第二个异常时丢失第一个异常的信息。

一般来说,多个 try catch 块的可读性看起来很糟糕。理想情况下希望避免这种混乱。总是可以将嵌入的 try/catch 捆绑在一个方法中......虽然看起来仍然很糟糕,并且不能解决保留所有异常细节的问题。

【问题讨论】:

    标签: java exception exception-handling


    【解决方案1】:

    试试:

    try {
    ...
    } catch(Exception e) {
      try {
          response.sendError(500);
        } catch(IOException e2) {
          e2.initCause(e);
          throw e2;
        }
    }
    

    【讨论】:

    • 谢谢 - 没有意识到这是可能的......如果您正在处理已经有根本原因的异常,我想您很不走运。不过这种情况应该没问题。
    • 我认为您可以创建更多异常并将它们链接起来。
    • 如果e2 上已经设置了原因,您将如何处理?这有点棘手。在您的示例代码中,如果在 e2 上设置了原因,e2.initCause(e); 将引发异常。
    【解决方案2】:

    如果异常已经有原因,则使用initCause() 将无法正常工作。相反,您可以使用 addSupressed() 将异常包含在不同异常的堆栈跟踪中。

    try {
    ...
    } catch(Exception e) {
      try {
          response.sendError(500);
        } catch(IOException e2) {
          e.addSuppressed(e2);
          throw e;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-19
      • 1970-01-01
      • 2016-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多