【问题标题】:Unchecked Exception not being caught by Web.xml error-pageWeb.xml 错误页面未捕获未经检查的异常
【发布时间】:2011-10-02 08:05:08
【问题描述】:

我有一个未由指定的 web.xml 错误页面处理的未经检查的异常。我的目录设置如下:

/index.jsp

/error.jsp

/WEB-INF/web.xml

/此处的其他页面和目录

我在 web.xml 中指定了以下内容:

    <error-page>
        <exception-type>java.lang.Throwable</exception-type>
        <location>/error.jsp</location>
    </error-page>

    <error-page>
        <error-code>500</error-code>
        <location>/error.jsp</location>
    </error-page>

但是,当我通过错误的对象创建故意在我的登录 Servlet 中抛出 IllegalArgumentException 时,应用程序只会吃掉错误并将其记录在 Tomcat 6.0 日志中。该页面没有被重定向到 error.jsp 页面。

我做错了什么?如果您需要更多信息来帮助,请告诉我。以下是来自 Tomcat 6.0 日志的错误信息:

严重:Servlet.service() 用于 servlet AccountSignIn 抛出异常 java.lang.IllegalArgumentException: int id 无效 FindMeInfo.getInstance(), id: -1 在 com.blank.groupandpal.FindMeInfo.getInstance(FindMeInfo.java:15) 在 com.blank.accounts.servs.AccountSignInServlet.processRequest(AccountSignInServlet.java:107) 在 com.blank.accounts.servs.AccountSignInServlet.doPost(AccountSignInServlet.java:164) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 com.blank.filters.SessionAuthFilter.doFilter(SessionAuthFilter.java:79) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 com.blank.filters.IPControlFilter.doFilter(IPControlFilter.java:97) 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) 在 org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) 在 org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 在 org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 在 ch.qos.logback.access.tomcat.LogbackValve.invoke(LogbackValve.java:158) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) 在 org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:859) 在 org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:574) 在 org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1527) 在 java.lang.Thread.run(Thread.java:595)

谢谢。

【问题讨论】:

  • 你试过 java.lang.Exception 吗?
  • 是的,我尝试了 java.lang.Exception 以及 javax.servlet.ServletException。我尝试了所有这些单独以及组合,但错误仍然没有冒泡到 web.xml 定义的错误页面。

标签: java servlets servlet-filters web.xml


【解决方案1】:

我似乎记得在调用过滤器的doFilter 方法期间错误页面机制被禁用。您可以考虑让最外层的过滤器充当您自己的错误页面处理程序。

基于评论的其他信息:
该请求的错误页面机制被禁用,因为它正在由一个或多个过滤器(例如IPControlFilterSessionAuthFilter)处理。它与将过滤器应用于错误页面没有任何关系。我提到的“最外层过滤器”将映射到/*,并且会简单地执行以下操作:

try {
    chain.doFilter(request, response);
} catch (Throwable exc) {
    // set request attributes to capture error info and then forward to error page (e.g. /error.jsp)
}

换句话说,这个过滤器本质上是对错误页面机制的再创造......

【讨论】:

  • 感谢您的回复!好的,有 2 个问题,首先是,我在错误页面上有一个过滤器,你是说我应该为所有页面 (/*) 设置一个过滤器并检查每个请求的异常属性吗?另外,如果 doFilter 没有完成,有没有办法在 init() 期间手动设置错误页面?
  • Kschneid,我试过这个,但由于某种原因,块的 catch 部分中的 forward 不起作用。我尝试了 sendRedirect 和 RequestDispatcher.forward。他们都没有工作。此外,任何过滤页面是否都需要拥有自己的重新创建错误页面功能?
  • 我接受了这个答案,因为我现在知道我需要做什么,但我无法实现自己的错误过滤器(重新创建错误页面的功能)。
  • 我是个白痴,考虑到我正在使用 ajax 请求调用我的登录 servlet,我忘了设置我的响应类型。感谢您的帮助 kschneid。错误过滤器和页面已经过测试并且工作正常。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-15
  • 2014-08-26
  • 1970-01-01
相关资源
最近更新 更多