这并非特定于Tomcat。这特定于Servlet API。如何确定错误页面在Servlet
API规范2.5的第9.9.2节中指定。这是相关的摘录:
SRV.9.9.2错误页面
如果没有使用类层次结构匹配的
error-page包含声明的声明exception-type,并且抛出的异常是其ServletException子类或子类,则容器将提取该ServletException.getRootCause方法定义的包装后的异常。对错误页面声明进行第二遍处理,再次尝试与错误页面声明进行匹配,但改用包装的异常。
因此,您
SpecificExceptionA很可能被包裹在
ServletException,因此,
java.lang.Throwable是第一遍最接近的比赛。当您删除该条目时,将通过包装的异常进行第二次传递,从而
SpecificExceptionA获得匹配。
定义常规HTTP 500错误页面的正确方法是将其映射,
error-pre而不是
exception-type:
<error-page> <exception-type>org.SpecificExceptionA</exception-type> <location>/WEB-INF/views/error/timedout.jsp</location></error-page><error-page> <error-pre>500</error-pre> <location>/WEB-INF/views/error/error.jsp</location></error-page>
如果由于某些不清楚的原因而无法使用此选项,则解决此问题的方法之一是创建一个
Filter侦听
url-patternof的a
/*并基本上执行以下操作:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException { try { chain.doFilter(request, response); } catch (ServletException e) { Throwable rootCause = e.getRootCause(); if (rootCause instanceof SpecificExceptionA) { throw (SpecificExceptionA) rootCause; } else { throw e; } }}它仅需扩展
RuntimeException即可使用。



