首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >servlet异常的正确printstacktrace

servlet异常的正确printstacktrace
EN

Stack Overflow用户
提问于 2009-05-19 14:13:24
回答 4查看 3.1K关注 0票数 4

所以我使用了一个过滤器来捕获servlet异常(因为我们混合使用了jsf和普通的servlet)

当捕获ServletException并调用printstacktrace时,大部分信息都会丢失。

“真实”根异常似乎隐藏在“有趣”表达式的后面。

代码语言:javascript
复制
((ServletException) e.getRootCause().getCause()).getRootCause().getCause().getCause().getCause()

这显然不是做这件事的方法。

是打印此类异常的“完整”信息的一种简单方法。有人能解释一下为什么异常是这样包装的吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-05-19 14:29:40

看看commons-lang中的ExceptionUtils类。它包含几个用于打印整个异常链的有用方法。

票数 6
EN

Stack Overflow用户

发布于 2009-05-19 14:41:47

在我看了一下ExceptionUtils之后,问题就解决了!

代码语言:javascript
复制
    final StringWriter stacktrace = new StringWriter();
    ExceptionUtils.printRootCauseStackTrace(throwable,new PrintWriter(stacktrace));
    msg.append(stacktrace.getBuffer());

这会打印出完整的堆栈跟踪和每条相关的信息。

票数 3
EN

Stack Overflow用户

发布于 2009-05-19 14:20:32

这就是exception chaining。通过将异常包装在不同的异常中,您可以让异常在堆栈中冒泡,而不必让您的主应用程序类担心一些低级异常。

示例:

代码语言:javascript
复制
public void doStuff() throws StuffException {
    try {
        doDatabaseStuff();
    } catch (DatabaseException de1) {
        throw new StuffException("Could not do stuff in the database.", de1);
    }
}

这样,您的应用程序只需处理StuffException,但如果确实需要,它可以访问底层的DatabaseException

要了解您捕获的异常的最底层(和所有其他)异常,您可以迭代其根本原因:

代码语言:javascript
复制
    ...
} 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
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/883030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档