Учебники

JSP — обработка исключений

В этой главе. мы обсудим, как обрабатывать исключения в JSP. Когда вы пишете код JSP, вы можете делать ошибки кодирования, которые могут возникнуть в любой части кода. В вашем коде JSP могут возникнуть следующие типы ошибок:

Проверенные исключения

Проверенное исключение — это исключение, которое обычно является ошибкой пользователя или проблемой, которую программист не может предвидеть. Например, если файл должен быть открыт, но файл не найден, возникает исключение. Эти исключения нельзя просто игнорировать во время компиляции.

Исключения во время выполнения

Исключение времени выполнения — это исключение, которого программист мог бы избежать. В отличие от проверенных исключений, исключения во время выполнения игнорируются во время компиляции.

ошибки

Это вовсе не исключения, а проблемы, которые возникают вне контроля пользователя или программиста. Ошибки обычно игнорируются в вашем коде, потому что вы редко можете что-либо сделать с ошибкой. Например, если переполнение стека происходит, возникнет ошибка. Они также игнорируются во время компиляции.

Далее мы обсудим способы обработки исключительных ситуаций / ошибок во время выполнения в вашем коде JSP.

Использование объекта исключения

Объект исключения является экземпляром подкласса Throwable (например, java.lang. NullPointerException) и доступен только на страницах ошибок. В следующей таблице перечислены важные методы, доступные в классе Throwable.

S.No. Методы и описание
1

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

2

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

3

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage () .

4

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err , поток вывода ошибок.

5

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

6

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

public String getMessage ()

Возвращает подробное сообщение об исключении, которое произошло. Это сообщение инициализируется в конструкторе Throwable.

public Throwable getCause ()

Возвращает причину исключения в виде объекта Throwable.

public String toString ()

Возвращает имя класса, объединенного с результатом getMessage () .

public void printStackTrace ()

Печатает результат toString () вместе с трассировкой стека в System.err , поток вывода ошибок.

public StackTraceElement [] getStackTrace ()

Возвращает массив, содержащий каждый элемент в трассировке стека. Элемент с индексом 0 представляет вершину стека вызовов, а последний элемент в массиве представляет метод в нижней части стека вызовов.

public Throwable fillInStackTrace ()

Заполняет трассировку стека этого объекта Throwable текущей трассировкой стека, добавляя к любой предыдущей информации в трассировке стека.

JSP дает вам возможность указать страницу ошибок для каждого JSP. Всякий раз, когда страница генерирует исключение, контейнер JSP автоматически вызывает страницу ошибки.

Ниже приведен пример указания страницы ошибки для main.jsp . Чтобы настроить страницу ошибки, используйте директиву <% @ page errorPage = «xxx»%> .

<%@ page errorPage = "ShowError.jsp" %>

<html>
   <head>
      <title>Error Handling Example</title>
   </head>
   
   <body>
      <%
         // Throw an exception to invoke the error page
         int x = 1;
         
         if (x == 1) {
            throw new RuntimeException("Error condition!!!");
         }
      %>
   </body>
</html>

Теперь мы напишем один JSP ShowError.jsp для обработки ошибок, который приведен ниже. Обратите внимание, что страница обработки ошибок содержит директиву <% @ page isErrorPage = «true»%> . Эта директива заставляет компилятор JSP генерировать переменную экземпляра исключения.

<%@ page isErrorPage = "true" %>

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <p>Sorry, an error occurred.</p>
      <p>Here is the exception stack trace: </p>
      <pre><% exception.printStackTrace(response.getWriter()); %></pre>
   </body>
</html>

Получив доступ к main.jsp , вы получите вывод, похожий на следующий:

java.lang.RuntimeException: Error condition!!!
......

Opps...
Sorry, an error occurred.

Here is the exception stack trace:

Использование тегов JSTL для страницы ошибок

Вы можете использовать JSTL-теги, чтобы написать страницу с ошибкой ShowError.jsp . Эта страница имеет почти ту же логику, что и в приведенном выше примере, с лучшей структурой и большим количеством информации —

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

<html>
   <head>
      <title>Show Error Page</title>
   </head>
   
   <body>
      <h1>Opps...</h1>
      <table width = "100%" border = "1">
         <tr valign = "top">
            <td width = "40%"><b>Error:</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>Status code:</b></td>
            <td>${pageContext.errorData.statusCode}</td>
         </tr>
            
         <tr valign = "top">
            <td><b>Stack trace:</b></td>
            <td>
               <c:forEach var = "trace" 
                  items = "${pageContext.exception.stackTrace}">
                  <p>${trace}</p>
               </c:forEach>
            </td>
         </tr>
      </table>

   </body>
</html>

Получите доступ к main.jsp, будет сгенерировано следующее:

Opps...

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Error:

java.lang.RuntimeException: Error condition!!!

URI:

/main.jsp

Status code:

500

Stack trace:

org.apache.jsp.main_jsp._jspService(main_jsp.java:65)

org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265)

javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

Используя Try … Catch Block

Если вы хотите обрабатывать ошибки на одной и той же странице и хотите выполнить какое-то действие вместо запуска страницы с ошибками, вы можете использовать блок try …. catch .

Ниже приведен простой пример, который показывает, как использовать блок try … catch. Давайте поместим следующий код в main.jsp —

<html>
   <head>
      <title>Try...Catch Example</title>
   </head>
   
   <body>
      <%
         try {
            int i = 1;
            i = i / 0;
            out.println("The answer is " + i);
         }
         catch (Exception e) {
            out.println("An exception occurred: " + e.getMessage());
         }
      %>
   </body>
</html>

Получите доступ к main.jsp, он должен сгенерировать вывод, похожий на следующий: