错误处理程序 Servlet:如何获取异常原因

2022-09-04 01:01:11

我的 Web 中配置了一个错误 servlet.xml:

<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/ExceptionHandler</location>
</error-page>

右?

在我的(一般)servlet中:

doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        ...
        ...
    } catch (Exception e) {
        throw new ServletException("some mesage", e);
    }
}

因此,在这种情况下,“e”将是根本原因。

在我的 ExceptionHandler 类中,我有:

doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
    throwable.getCause() //NULL
}

这就是问题所在。throwable.getCause() 为 null。


答案 1

如果 servletcontainer 捕获的异常是 a,并且 声明为捕获 以外的异常,则其原因实际上将被解包并存储为 。所以你基本上已经把它作为变量,你不需要调用它。ServletException<error-page>ServletException"javax.servlet.error.exception"throwablegetCause()

另请参阅 Servlet 2.5 规范第 9.9.2 章的第 5 段:

如果没有包含使用类层次结构匹配的拟合的声明,并且引发的异常是其子类或子类,则容器将提取由方法定义的包装异常。对错误页声明进行第二次传递,再次尝试与错误页声明进行匹配,但改用包装的异常。error-pageexception-typeServletExceptionServletException.getRootCause

顺便说一句,最好使用 RequestDispatcher#ERROR_EXCEPTION常量,而不是对其进行硬编码。

Throwable throwable = (Throwable) request.getAttribute(RequestDispatcher.ERROR_EXCEPTION);

答案 2

编辑。

好吧,这可能是错误的,我没有处理servlets的个人经验:而不是getCause(),为ServletException添加一个检查实例,如果它通过,把你的Shrewable移植到ServletException并使用getRootCause()BalusC似乎有更好的解决方案,对于较新的Servlet API版本)

有关深入讨论,请参阅无根本原因的异常

较新的 Servlet API 版本没有此问题,但如果您使用的是某些旧版本(2.4 或更早版本),则还应该更新 ServletException 抛出代码:

doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    try {
        ...
        ...
    } catch (Exception e) {
        ServletException se = new ServletException(e.getMessage(), e);
        se.initCause(e);
        throw se;
    }
}

推荐