所以我使用了一个过滤器来捕获servlet异常(因为我们混合使用了jsf和普通的servlet)
当捕获ServletException并调用printstacktrace时,大部分信息都会丢失。
“真实”根异常似乎隐藏在“有趣”表达式的后面。
((ServletException) e.getRootCause().getCause()).getRootCause().getCause().getCause().getCause()这显然不是做这件事的方法。
是打印此类异常的“完整”信息的一种简单方法。有人能解释一下为什么异常是这样包装的吗?
发布于 2009-05-19 14:29:40
看看commons-lang中的ExceptionUtils类。它包含几个用于打印整个异常链的有用方法。
发布于 2009-05-19 14:41:47
在我看了一下ExceptionUtils之后,问题就解决了!
final StringWriter stacktrace = new StringWriter();
ExceptionUtils.printRootCauseStackTrace(throwable,new PrintWriter(stacktrace));
msg.append(stacktrace.getBuffer());这会打印出完整的堆栈跟踪和每条相关的信息。
发布于 2009-05-19 14:20:32
这就是exception chaining。通过将异常包装在不同的异常中,您可以让异常在堆栈中冒泡,而不必让您的主应用程序类担心一些低级异常。
示例:
public void doStuff() throws StuffException {
try {
doDatabaseStuff();
} catch (DatabaseException de1) {
throw new StuffException("Could not do stuff in the database.", de1);
}
}这样,您的应用程序只需处理StuffException,但如果确实需要,它可以访问底层的DatabaseException。
要了解您捕获的异常的最底层(和所有其他)异常,您可以迭代其根本原因:
...
} catch (SomeException se1) {
Throwable t = se1;
logger.log(Level.WARNING, "Top exception", se1);
while (t.getCause() != null) {
t = t.getCause();
logger.log(Level.WARNING, "Nested exception", t);
}
// now t contains the root cause
}https://stackoverflow.com/questions/883030
复制相似问题