4

我有一个有趣的场景,我在 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 捆绑在一个方法中......虽然看起来仍然很糟糕,并且不能解决保留所有异常细节的问题。

4

2 回答 2

8

尝试:

try {
...
} catch(Exception e) {
  try {
      response.sendError(500);
    } catch(IOException e2) {
      e2.initCause(e);
      throw e2;
    }
}
于 2013-04-03T00:16:48.163 回答
8

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

try {
...
} catch(Exception e) {
  try {
      response.sendError(500);
    } catch(IOException e2) {
      e.addSuppressed(e2);
      throw e;
    }
}
于 2019-01-15T20:46:33.813 回答