English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

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

При написании JSP-программ программисты могут пропустить некоторые БУГ, которые могут出现在 anywhere в программе. В JSP-коде обычно есть несколько типов исключений:

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

В этом разделе будут даны несколько простых и изящных способов обработки runtime исключений и ошибок.

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

Объект exception является примером подкласса Throwable, доступен только на странице ошибки. В таблице приведены некоторые важные методы класса Throwable:

Номер Метод&Описание
1 public String getMessage()

Возвращает информацию об исключении. Эта информация инициализируется в конструкторе Throwable
2 public Throwable getCause()

Возвращает причину исключения, типом является объект Throwable
3 public String toString()

Возвращает имя класса
4 public void printStackTrace()

Вывод трассировки исключения в System.err
5 public StackTraceElement [] getStackTrace()

Возвращает трассировку исключения в виде массива элементов стека трассировки
6 public Throwable fillInStackTrace()

Использовать текущий стек трассировки для наполнения объекта Throwable

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

Следующий пример указывает на страницу ошибки для main.jsp. Используйте инструкцию <%@page errorPage="XXXXX"%> для указания страницы ошибки.

<%@ page errorPage="ShowError.jsp" %>
<html>
<head>
   <title>Пример обработки ошибок</title>
</head>
<body>
<%
   // Внушить исключение для вызова страницы с ошибкой
   int x = 1;
   if (x == 1)
   }
      throw new RuntimeException("Error condition!!!");
   }
%>
</body>
</html>

现在,编写ShowError.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()); %>

注意到,ShowError.jsp文件使用了<%@page isErrorPage="true"%>指令,这个指令告诉JSP编译器需要产生一个异常示例变量。

现在试着访问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>Стек трассировки:</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.

Следующий пример показывает, как использовать блок try…catch, поместите этот код в main.jsp:

<html>
<head>
   <title>Пример Try...Catch</title>
</head>
<body>
<%
   try{
      int i = 1;
      i = i / 0;
      out.println("Ответ: " + i);
   }
   catch (Exception e){
      out.println("Произошла ошибка: " + e.getMessage());
   }
%>
</body>
</html>

Попробуйте посетить main.jsp, и вы получите следующий результат:

Произошла ошибка: / by zero