我有一个有趣的场景,我在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 ...但仍然看起来很糟糕并且无法解决保留所有异常细节的问题。
答案 0 :(得分:7)
尝试:
try {
...
} catch(Exception e) {
try {
response.sendError(500);
} catch(IOException e2) {
e2.initCause(e);
throw e2;
}
}
答案 1 :(得分:1)
如果异常已经有原因,则使用initCause()
不会失去工作。相反,您可以使用addSupressed()
将异常包含在其他异常的堆栈跟踪中。
try {
...
} catch(Exception e) {
try {
response.sendError(500);
} catch(IOException e2) {
e.addSuppressed(e2);
throw e;
}
}