Как правильно обрабатывать исключения в приложении JSP/Servlet?

Как правильно обрабатывать ошибки, обнаруженные в сервлете? Прямо сейчас приложение, которое я унаследовал (использует только простой JSP/Servlet), имеет суперкласс с именем Controller, который расширяет HttpServlet и из которого распространяются все остальные сервлеты. В этом классе Controller есть блок try и catch, как показано ниже:

try {
    // execute doPost or doGet here
} catch (Exception e) {
    // show a generic error page
}

Это правильный способ сделать это? Он кажется неуклюжим и, похоже, не всегда работает. Я всего лишь стажер, поэтому у меня нет большого опыта в этом. Любой совет? Я пытаюсь сделать приложение надежным..

Ответ 1

Стандартная задача - использовать ваш метод Servlet doXxx() (например, doGet(), doPost() и т.д.), бросить a ServletException и разрешить контейнеру поймать и обработать его. Вы можете указать страницу пользовательской ошибки, которая будет отображаться в WEB-INF/web.xml, с помощью тега <error-page>:

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

Если вы закончите поиск Exception, который вы не можете элегантно обработать, просто оберните его в ServletException следующим образом:

try {
    // code that throws an Exception
} catch (Exception e) {
    throw new ServletException(e);
}

Ответ 2

Или вы можете перехватить все свои исключения с помощью сервлета:

<!-- WEB-INF/web.xml -->
<servlet>
    <servlet-name>ErrorServlet</servlet-name>
    <servlet-class>com.domain.MyErrorServlet</servlet-class>
</servlet>    
<servlet-mapping>
<servlet-name>ErrorServlet</servlet-name>
    <url-pattern>/error</url-pattern>
</servlet-mapping>
<error-page>
    <exception-type>java.lang.Throwable</exception-type>
    <location>/error</location>
</error-page>

Затем в сервлете вы можете обрабатывать исключение, подобное этому

public class MyErrorServlet extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response){
       Throwable throwable = (Throwable) request.getAttribute("javax.servlet.error.exception");
       // You can log the exception, send to email, etc
    }
}

Ответ 3

Есть несколько лучших практик, когда дело доходит до исключений. Как правило, вы можете обрабатывать его, позволять ему пузыриться (для неконтролируемых исключений), регистрировать его или обертывать.

Вам следует избегать catching и throwing exception, вместо этого поймать более конкретное исключение или создать свой собственный тип исключения и обернуть в него текущее исключение.

Вот большой ресурс для использования в качестве "чего не делать" с точки зрения исключений: http://today.java.net/article/2006/04/04/exception-handling-antipatterns

Ответ 4

В JSP вы можете использовать библиотеку ядра jstl

1) Импортировать tablib поверх файла JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

2) использовать тег

<c:catch var="myExceptionObject">
    Code that might throw Exception
</c:catch>

<c:if test="${myExceptionObject} != null">
    There was an exception: ${myExceptionObject.message}
</c:if>