【问题标题】:Handling servlets exceptions处理 servlet 异常
【发布时间】:2015-08-13 22:25:20
【问题描述】:

我在处理 web servlet 应用程序中的异常时遇到了麻烦。 我创建了 ErrorHandler servlet,它处理所有传入的异常并在 web.xml 文件中添加条目:

<servlet>
    <servlet-name>ErrorHandler</servlet-name>
    <servlet-class>ServletPackage.ErrorHandler</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ErrorHandler</servlet-name>
    <url-pattern>/ErrorHandler</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>java.lang.Exception</exception-type>
    <location>/ErrorHandler</location>
</error-page>

问题是服务器根本没有调用 ErrorHandler servlet。 Glassfish 只是在控制台中抛出异常,Web 浏览器刷新抛出异常的 servlet(由于未处理的异常没有数据)。

Warning:   StandardWrapperValve[SessionChecker]: Servlet.service() for servlet SessionChecker threw exception
javax.servlet.ServletException: Forced exception thrown
    at ServletPackage.SessionChecker.processRequest(SessionChecker.java:158)
    at ServletPackage.SessionChecker.doPost(SessionChecker.java:174)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:344)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:214)
   .
   .
   .

有什么建议吗?

【问题讨论】:

  • 有什么建议吗?我真的需要让它按应有的方式工作,并且不知道为什么 ErrorHandler 无法处理任何异常。也许我的思路有问题,它根本不会以这种方式工作?

标签: java jakarta-ee servlets exception-handling glassfish


【解决方案1】:

我也有同样的问题。正如您所展示的那样,整个网络都是示例,当我尝试它时,似乎我的处理程序 servlet 被完全忽略了。

确保我的错误处理 servlet 同时实现了 doGet 和 doPost:

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    processError(request, response);
}

public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
    processError(request, response);
}

private void processError(HttpServletRequest request, HttpServletResponse response) throws IOException
{
    Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
    ...
}

我的 servlet 所基于的示例仅实现了 doGet。因此,当我的 servlet 被加载并调用错误时,这些错误并没有发生任何事情。实施 doPost 以同样的方式处理错误为我解决了这个问题。

【讨论】:

  • 这是一个非常有用的答案!
【解决方案2】:

如果您的网络服务器抛出异常,您在 web.xml 中声明的异常处理程序将永远不会处理它。

web.xml 中的异常处理程序用于处理进入 Web 服务器的请求。

【讨论】:

  • 那么有什么办法可以查看我的 ErrorHandler 吗?我想不可能在来自网站的 HTTP 请求中抛出异常,如果不能像你所说的那样从其他 servlet 抛出异常,我真的不明白这样做的目的和目标。在 turtorialspoint.com 上,我读到“当 servlet 引发异常时,Web 容器会搜索 web.xml 中使用异常类型元素的配置,以与引发的异常类型匹配。”。这正是我尝试做的,从 servlet 代码中抛出异常。
  • 我之前没用过这个机制。但是异常类型是否可能需要完全匹配,即匹配完全限定的类名,而不匹配类型层次结构中的任何类名。
  • 没关系,我尝试了 ServletException 或 IOException ,结果是一样的。但是我想知道这个问题是否可能是由影响我项目中所有 servlet 的过滤器类引起的。
  • “异常类型可能需要完全匹配” - 并非如此。 java.lang.Exception 应该足够了 (Throwable) 是更可取的。但这是某种先有鸡的场景:OP 定义了一个错误处理程序,但错误处理程序本身不起作用。您希望容器在这种情况下做什么?
  • @baka1408,Tomcat启动后日志有错误吗?
猜你喜欢
  • 2010-12-24
  • 2014-05-23
  • 1970-01-01
  • 2011-12-26
  • 2013-08-13
  • 2014-05-11
  • 2019-04-17
  • 2019-10-08
相关资源
最近更新 更多