Unchecked Exception не перехватывается страницей ошибок Web.xml

У меня есть непроверенное исключение, которое не обрабатывается указанной страницей ошибки 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>

Однако, когда я целенаправленно выбрасываю исключение IllegalArgumentException в своем сервлете входа через создание плохого объекта, приложение просто съедает ошибку и регистрирует ее в журнале Tomcat 6.0. Страница не перенаправляется на страницу error.jsp.

Что я делаю неправильно? Если вам нужна дополнительная информация, пожалуйста, дайте мне знать. Ниже приведена информация об ошибке из журнала Tomcat 6.0:

СЕРЬЕЗНЫЙ: Servlet.service() для сервлета. 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.ac cess.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)

Спасибо.


person oberger    schedule 10.07.2011    source источник
comment
вы пробовали java.lang.Exception вместо этого?   -  person Bozho    schedule 11.07.2011
comment
Да, я пробовал java.lang.Exception, а также javax.servlet.ServletException. Я пробовал все их по отдельности, а также в сочетании, но ошибка по-прежнему не всплывает на страницу ошибки, определенную в web.xml.   -  person oberger    schedule 11.07.2011


Ответы (1)


Кажется, я припоминаю, что механизм страницы ошибок отключается во время вызова метода doFilter фильтра. Вы можете рассмотреть возможность использования самого внешнего фильтра в качестве собственного обработчика страницы ошибок.

Дополнительная информация на основе комментария:
Механизм страницы ошибок отключен для запроса, поскольку он обрабатывается одним или несколькими фильтрами (например, IPControlFilter и SessionAuthFilter). Это не имеет ничего общего с применением фильтра к странице с ошибкой. «Самый внешний фильтр», о котором я упоминал, будет сопоставлен с /* и будет просто делать что-то вроде:

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)
}

Другими словами, этот фильтр, по сути, воссоздает механизм страницы ошибок...

person kschneid    schedule 13.07.2011
comment
Спасибо за ответ! Хорошо, 2 вопроса, во-первых, у меня есть фильтр на странице ошибок, вы говорите, что я должен сделать фильтр для всех страниц (/*) и проверять каждый запрос на наличие атрибута исключения? Кроме того, есть ли способ вручную установить страницу ошибок во время init(), если doFilter этого не делает? - person oberger; 14.07.2011
comment
Kschneid, Я пробовал это, но почему-то не работает форвард в части захвата блока. Я пробовал sendRedirect и RequestDispatcher.forward. Ни один из них не работает. Кроме того, действительно ли любая отфильтрованная страница должна иметь собственную воссозданную функциональность страницы ошибок? - person oberger; 16.07.2011
comment
Я принял этот ответ, потому что теперь знаю, что мне нужно делать, я просто не могу реализовать свой собственный фильтр ошибок (воссоздать функциональность страницы ошибок). - person oberger; 16.07.2011
comment
Я идиот и забыл установить свой тип ответа соответствующим образом, учитывая, что я вызывал свой вход в сервлет с запросом ajax. спасибо за помощь kschneid. Фильтр ошибок и страница были протестированы и работают нормально. - person oberger; 16.07.2011