При написании программ JSP программисты могут пропустить некоторые ошибки, и эти ошибки могут появиться в любом месте программы. В коде JSP обычно присутствуют следующие типы исключений:
Проверенное исключение. Проверенное исключение — это типичная ошибка пользователя или ошибка, которую программист не может предвидеть. Например, если файл собирается открыться, но его не удается найти, выдается исключение. Эти исключения нельзя просто игнорировать во время компиляции.
Исключение времени выполнения: программист мог избежать исключения времени выполнения. Это исключение будет игнорироваться во время компиляции.
Ошибка: Здесь нет исключения, но проблема в том, что она находится вне контроля пользователя или программиста. Ошибки в коде часто игнорируются, и с этим мало что можно сделать. Например, ошибка переполнения стека. Эти ошибки будут игнорироваться во время компиляции.
В этом разделе вы найдете несколько простых и элегантных способов обработки исключений и ошибок во время выполнения.
Объект исключения является экземпляром подкласса Throwable и доступен только на страницах ошибок. В следующей таблице перечислены некоторые важные методы класса Throwable:
серийный номер | Метод и описание |
---|---|
1 | public String getMessage() возвращает информацию об исключении. Эта информация инициализируется в конструкторе Throwable. |
2 | public ThrowablegetCause() возвращает причину исключения, тип — объект Throwable. |
3 | public String toString() возвращает имя класса |
4 | public void printStackTrace() выводит трассировку стека исключений в System.err |
5 | public StackTraceElement [] getStackTrace() возвращает трассировку стека исключений в виде массива элементов трассировки стека |
6 | public ThrowablefillInStackTrace() использует текущую трассировку стека для заполнения объекта Throwable. |
JSP предоставляет возможность указать страницы ошибок для каждой страницы JSP. Всякий раз, когда страница выдает исключение, контейнер JSP автоматически вызывает страницу ошибки.
В следующем примере указывается страница ошибки для main.jsp. Используйте директиву <%@page errorPage="XXXX"%>, чтобы указать страницу с ошибкой.
<%@ page errorPage="ShowError.jsp" %><html><head> <title>Пример обработки ошибок</title></head><body><% // Выдаем исключение для вызова страницы с ошибкой int x = 1; if (x == 1) { throw new RuntimeException("Условие ошибки!!!" } %></body></html>
Теперь напишите файл ShowError.jsp следующим образом:
<%@ page isErrorPage="true" %><html><head><title>Показать страницу ошибки</title></head><body><h1>Упс...</h1><p>Извините, произошла ошибка.</p><p>Вот трассировка стека исключений: </p><pre><%Exception.printStackTrace(response.getWriter() %>);
Обратите внимание, что файл ShowError.jsp использует директиву <%@page isErrorPage="true"%>, которая сообщает компилятору JSP, что ему необходимо сгенерировать переменную экземпляра исключения.
Теперь попробуйте получить доступ к странице main.jsp, это даст следующие результаты:
java.lang.RuntimeException: Состояние ошибки!!!......Оппс...Извините, произошла ошибка. Вот трассировка стека исключений:
Вы можете использовать теги JSTL для записи страницы ошибки ShowError.jsp. Код в этом примере имеет почти ту же логику, что и код в предыдущем примере, но код в этом примере лучше структурирован и предоставляет больше информации:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isErrorPage="true" %><html><head><title> Показать страницу ошибки</title></head><body><h1>Оппс...</h1><table><tr valign="top"><td><b>Ошибка:</b></td><td>${pageContext.Exception</td></tr><tr valign="top"><td> <b>URI:</b></td><td>${pageContext.errorData.requestURI</td></tr><tr valign="top"><td><b>Статус код:</b></td><td>${pageContext.errorData.statusCode</td></tr><tr valign="top"><td><b>Трассировка стека:</b> </td><td><c:forEach var="trace" items="${pageContext.Exception.stackTrace}"><p>${trace}</p></c:forEach></td></tr></table></body></html>
Результаты бега следующие:
Если вы хотите разместить обработку исключений на странице и обрабатывать разные исключения по-разному, вам нужно использовать блок try...catch.
В следующем примере показано, как использовать блок try...catch, поместив этот код в main.jsp:
<html><head> <title>Попробуй...Подробный пример</title></head><body><% try { int i = 1; i = i / 0; out.println("Ответ: " + i); } catch (Exception e){ out.println("Произошло исключение: " + e.getMessage() } %></body></html>
Попробуйте получить доступ к main.jsp, это даст следующие результаты:
Произошло исключение: / по нулю