Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Перехват ошибки на сервлете


Автор: Fly1410 16.7.2007, 15:06
Есть такой сервлет
Код

public class A extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        
        try{
            String s ="abc";
            Integer.parseInt(s);
        } catch(Exception e){
            throw new ServletException("123");
        }
    }
    
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }
}


В нем специально вызываю шибку

Web.xml файл:

Код

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
    xmlns="http://java.sun.com/xml/ns/j2ee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    
  <servlet>
    <servlet-name>A</servlet-name>
    <servlet-class>com.epam.A</servlet-class>
  </servlet>
  
  <servlet>
    <servlet-name>Error</servlet-name>
    <servlet-class>com.epam.Error</servlet-class>
  </servlet>


  <servlet-mapping>
    <servlet-name>A</servlet-name>
    <url-pattern>/A</url-pattern>
  </servlet-mapping>
  
  
  <servlet-mapping>
    <servlet-name>Error</servlet-name>
    <url-pattern>/Error</url-pattern>
  </servlet-mapping>

    <error-page>
        <exception-type>javax.servlet.ServletException</exception-type>
        <location>/Error</location>
    </error-page>
    
    <error-page>
        <error-code>500</error-code>
        <location>/error500.jsp</location>
    </error-page>
      
</web-app>


код сервлета который отображает сообщение об ошибке


Код

public class Error extends HttpServlet {    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();        
        out.println("error");
        out.flush();
        out.close();
    }

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


И он длжен при обращении к сервлету A вызывать ошибку и отправлять на сервлет Error. Так и происходит в Mozilla, но в Explorer он пишет ошибка 500. Причем страница ошибки которая встроена в Explorer (не TomCat-a). Хотя ошибку 500 он тоже должен перехватывать. Чего я не дописал что бы это заработало в Explorer-e. 

И ещё он печатает StackTrace. Как это можно отменить?


Автор: AlexeyVorotnikov 16.7.2007, 15:46
По-идее, поведение сервлет-контейнера не должно зависеть от типа браузера. И то, что перехват ошибки работает с Mozilla и не работает с IE, очень странно.
Кстати, где он печатает стектрейс?

Автор: Fly1410 16.7.2007, 16:03
В консоле
Код

java.lang.NumberFormatException: For input string: "abc"
    at java.lang.NumberFormatException.forInputString(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at java.lang.Integer.parseInt(Unknown Source)
    at com.epam.A.doGet(A.java:25)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Unknown Source)
Jul 16, 2007 4:06:32 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet A threw exception
javax.servlet.ServletException: 123
    at com.epam.A.doGet(A.java:28)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Unknown Source)
Jul 16, 2007 4:06:32 PM org.apache.catalina.core.ApplicationContext log


вот такой код. 

Автор: AntonSaburov 16.7.2007, 16:14
Может какое скрытое поле передается - у тебя же ошибка преобразования числа из строки и там "abc".

Посмотри код сервлета внимательнее и проверь параметры, которые передаются.

Автор: AlexeyVorotnikov 16.7.2007, 17:00
Сейчас не поленился, и собрал такое приложение. Перехват ошибки отлично работает. У меня Tomcat версий 4.1 и 5.5. Браузеры Firefox 2.0.0.4 и IE 7.
Больше, наверное, ничем не могу быть полезен.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)