Tomcat:处理Servlet异常

时间:2009-12-07 21:00:49

标签: php exception tomcat servletconfig

我使用PECL-servlet(PHP / PECL-version 5.2.5)在我的Tomcatserver上设置PHP。服务器现在成功处理真正的PHP文件,但我对不存在页面的请求有问题。

对这样一个页面的请求f.ex:http://www.mydomain.com/nonexistentfile.php会导致servlet引发一个java.io.IOException,它永远不会被捕获。因此Tomcat被终止了。

我该如何解决这个问题?我可以从servlet中捕获异常吗?有没有办法只将现有文件映射到servlet?


感谢您的回复,它似乎现在正在运作。我在web.xml中做了你建议的重新映射,将php文件映射到我的第一个自制的servlet,它基本上包裹了phpservlet并处理引发的异常。这是解决问题的好方法吗?

对我来说,tomcat无法单独处理此类异常似乎有点奇怪。我可以看到终止服务器以防止它在损坏状态下执行的重点,但应该可以启用自定义异常处理......

在使用不存在的页面直接调用phpservlet之后,这是我的localhost.2009-12-09.log:
(tomcat在终止之前显示堆栈跟踪的4个第一行的默认错误)

09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: SessionListener: contextInitialized()
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.Registry', 'org.apache.tomcat.util.modeler.Registry@1010058')
09.des.2009 13:35:50 org.apache.catalina.core.ApplicationContext log
INFO: ContextListener: attributeAdded('org.apache.catalina.MBeanServer', 'com.sun.jmx.mbeanserver.JmxMBeanServer@bdab91')
09.des.2009 13:35:54 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet php threw exception
java.io.IOException: 
 at net.php.servlet.send(Native Method)
 at net.php.servlet.service(servlet.java:190)
 at net.php.servlet.service(servlet.java:214)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:286)
 at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:845)
 at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583)
 at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447)
 at java.lang.Thread.run(Unknown Source)

1 个答案:

答案 0 :(得分:0)

您通常在<error-page>中将其声明为web.xml

但是,既然你真的说过,“它从未被捕获过。因此Tomcat被终止了”,我对设置有疑问。你真的没有看到Tomcat的默认错误页面里面有堆栈跟踪吗?你在appserver日志中看不到任何东西吗?你是怎么知道IOException的?

至少,您可以尝试在Filter url-pattern上映射*.php,其中基本上包含以下几行:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException {
    try {
        chain.doFilter(request, response);
    } catch (IOException e) { 
        // Handle it.
    }
}

但是看看你如何描述问题,我宁愿认为PHP servlet或webcontainer无法显示错误页面,因为响应已经提交,但在这种情况下你应该看到一个相当自我解释{{ 1}} appserver日志中的错误。