Как правильно обрабатывать исключения в приложении 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>