- Details
- Written by
- Last Updated on 21 July 2019 | Print Email
Generally, there are three ways to handle exceptions in a JSP page:
-
- Catching the exceptions directory in the JSP page.
- Specifying a separate JSP error page using page directive. This is called page-level exception handling.
- Configuring mapping of exception types-error pages in web.xml file (application-level exception handling).
Let’s take closer look at each approach in details with their own benefit and drawback.
1. Catching exceptions directly in JSP page
This is the simplest way, as we place a try-catch block directly into the JSP page, for example:
<%@ page language="java" %> <html> <body> <% try { int x = Integer.parseInt(request.getParameter("x")) ; %> <h2>You pass the number: <%=x%></h2> <% } catch (NumberFormatException ex) { %> <h2>Error: x must be a number</h2> <% } %> </body> </html>
The above code snippet tries to parse a number from a parameter which is passed from URL query string. If the parameter is not a number (indicated by the NumberFormatException is thrown), shows an error message.
Following is a more meaningful example which is a JSP page that calculates sum of two numeric parameters passed from query string:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Sum calculation</title> </head> <body> <%! int x; int y; %> <% try { x = Integer.parseInt(request.getParameter("x")) ; } catch (NumberFormatException ex) { %> <h2>Error: x must be a number</h2> <% return; } try { y = Integer.parseInt(request.getParameter("y")) ; } catch (NumberFormatException ex) { %> <h2>Error: y must be a number</h2> <% return; } %> <h1> Sum of <%=x%> and <%=y%> is <%=(x + y) %> </h1> </body> </html>
If the two parameters are numeric, the page displays sum of them:
If either a number is not numeric, an appropriate error message is displayed:
Benefits:
-
- Quick and easy to implement, just like traditional exception handling in pure Java code.
- Suitable for specific, recoverable errors which the application’s workflow can continue in case the exceptions occurred.
Drawbacks:
-
- This approach is generally not recommended, because it’s not a good practice to put Java code directly into JSP pages which are designed to represent view layer, not containing logic code.
- It’s inefficient if we want to handle exceptions for many JSP pages as with this approach, it requires to duplicate try-catch blocks in every single JSP page.
2. Page-level exception handling
In this way, we use JSP page directives to specify a separate error page which will be redirected in case exceptions occurred in the normal JSP page. The following diagram depicts this approach:
With this approach, there are two attributes of the page directive we have to specify for handling exceptions:
- errorPage=”path/to/error/handling/page”: Used in the JSP page in which exceptions might occur. This specifies an alternate JSP page which is written solely for handling exceptions such as showing exception class name, error message and exception stack trace. When the code in this page throws an exception, the server will redirect the client to the specified error handling page.
- isErrorPage=”true”: Used to indicate a JSP page is an error handling page so that the server will pass the exception object thrown by the original JSP page. The exception object is a subclass of java.lang.Throwable class so we can access the following details:
Let’s see an example. Consider the following JSP page:
<%@ page language="java" contentType="text/html; charset=UTF-8" errorPage="error_jstl.jsp" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Calculate division of two numbers</title> </head> <body> <% int x = Integer.parseInt(request.getParameter("x")); int y = Integer.parseInt(request.getParameter("y")); int div = x / y; %> <h2>Division of <%=x%> and <%=y%> is <%=div%></h2> </body> </html>
This page calculates division of two numbers passed from parameters query string. There are two possible exceptions here:
-
- The passed parameters do not have numeric values (a NumberFormatException will be thrown).
- The dividing number is zero (an ArithmeticException will be thrown).
And here is code of the error handling page (error.jsp):
<%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Error</title> </head> <body> <h2> Error: <%=exception.getClass().getName() %><br/> <%=exception.getMessage() %><br/> </h2> </body> </html>
Here are some outputs when running this example:
- If two parameters are numeric:
- If either a parameter is not numeric:
- If the dividing number is zero:
Apart from accessing the exception object using JSP scriptlet, we can use JSTL to achieve the same goal in a more convenient way. For example:
Error: ${pageContext.exception}
To print the exception stack traces using JSTL:
<c:forEach var="trace" items="${pageContext.exception.stackTrace}"> ${trace}<br/> </c:forEach>
Here is a better version of the error.jsp page using JSTL:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page language="java" contentType="text/html; charset=UTF-8" isErrorPage="true" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Error</title> </head> <body> <h2> Error: ${pageContext.exception} <br/> </h2> Exception stack trace:<br/> <c:forEach var="trace" items="${pageContext.exception.stackTrace}"> ${trace}<br/> </c:forEach> </body> </html>
Output:
Benefits:
-
- This page-level exception handling in JSP is more convenient than using try-catch blocks, as we can create separate error handling page and re-use it across JSP pages.
Drawbacks:
-
- This approach specifies one error handling page for all kind of exceptions, so we can’t specify error page per exception type. For example: dbError.jsp for java.sql.SQLException, ioError.jsp for java.io.IOException, etc.
- Error handling configuration is depending on JSP pages: Whenever a new JSP page is added, we have to specify the attribute errorPageof the page directive. When file name of an error page is changed, we have to update all the referenced JSP pages as well.
3. Application-level exception handling
In this way, we can configure error handling page per exception type for all JSPs and servlets of the web application, by adding some entries in the web.xml file. Here is the syntax for configuring an error page for a specific exception type:
<error-page> <exception-type>fully_qualified_name_of_exception_class</exception-type> <location>path_to_error_jsp_page</location> </error-page>
For example:
<error-page> <exception-type>java.sql.SQLException</exception-type> <location>/dbError.jsp</location> </error-page>
That will tell the server to redirect the clients to the dbError.jsp page whenever any JSP/Servlet throws an exception of type java.sql.SQLException. The dbError.jsp page does not have to declare the attribute isErrorPage.
Using this approach we can also specify a custom error handling page for specific HTTP error code like 404, 500… The syntax is:
<error-page> <error-code>HTTP_error_code</error-code> <location>path_to_error_jsp_page</location> </error-page>
For example:
<error-page> <error-code>404</error-code> <location>/404error.jsp</location> </error-page>
That will tell the server redirects all requests causing HTTP 404 error to the custom page 404error.jsp, instead of showing the default 404 error. Following is example code of the 404error.jsp page:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>404 Error</title> </head> <body> <center> <h2> Apologize, we could not find the page you were looking for: </h2> ${pageContext.errorData.requestURI} </center> </body> </html>
The errorData object provides detailed information about the error such as the request URI, status code, servlet name, and the Throwable object that caused the error:
Here is the output when trying to access non-exist URL on the server:
Benefit:
-
- This application-level error handling is easy to use and independent of JSP pages so this is the most preferred way for exception handling in JSP.
Drawback:
-
- The only drawback for this approach is that, every changes made to the configuration requires application/server restart, because the configuration is done in the web.xml file.
Related Java Exception Handling Tutorials:
- Getting Started with Exception Handling in Java
- How to Handle Error in Web.xml for Java web applications
Other JSP Tutorials:
- Summary of EL operators with examples
- Java Servlet and JSP Hello World Tutorial with Eclipse, Maven and Apache Tomcat
- How to list records in a database table using JSP and JSTL
- How to create dynamic drop down list in JSP from database
- Sending e-mail with JSP, Servlet and JavaMail
About the Author:
Nam Ha Minh is certified Java programmer (SCJP and SCWCD). He started programming with Java in the time of Java 1.4 and has been falling in love with Java since then. Make friend with him on Facebook and watch his Java videos you YouTube.
Add comment
При написании приложения JSP, программисты могут пропустить некоторые ошибки, то ошибка может появиться в любом месте в программе. JSP-код, как правило, следующие категории исключений:
- Проверяемые исключения: проверяемые исключения является типичной ошибки пользователя или программист непредвиденные ошибки. Например, если файл будет открыт, но не может найти файл, то генерируется исключение. Эти аномалии больше не могут компиляции просто игнорируется.
- Продолжительность исключение: исключение времени выполнения программисты, возможно, было бы избежать, эта аномалия будет игнорироваться во время компиляции.
- Ошибка: Там не исключение, но проблема в том, что она находится вне контроля пользователя или программиста. Ошибка часто забывают в коде, вы вряд ли принять его как. В качестве примера, или ошибка переполнения стека. Эти ошибки будут проигнорированы во время компиляции.
Этот раздел даст несколько простой и элегантный способ обработки исключений во время выполнения и ошибок.
Использование исключений Объекты
Объект исключения является экземпляром Throwable подкласса, доступна только на странице ошибки. В следующей таблице перечислены некоторые из Throwable класса в важных направлениях:
Нет . | Метод и описание |
---|---|
1 | Строка GetMessage общественности () Возвращает исключение. Эта информация инициализируется в конструкторе Throwable |
2 | общественного ThrowablegetCause () Возвращает причину исключения, объект типа Throwable |
3 | общественного Строка ToString () Возвращает имя класса |
4 | общественного недействительными printStackTrace () Выходной сигнал стека исключений трассировки System.err |
5 | общественного StackTraceElement [] getStackTrace () В форме трассировки стека элемент массива возвращает стека исключений трассировки |
6 | общественного ThrowablefillInStackTrace () В настоящее время трассировки стека заполнить объект Throwable |
JSP предоставляет возможность указать страницы ошибок для каждой страницы JSP. Всякий раз, когда страница генерирует исключение, JSP контейнер автоматически вызовет страницу ошибки.
Следующие примеры main.jsp указывает страницу ошибки. Используйте <% @ страницы errorPage = «ХХХХХ»%> директива указывает на страницу с ошибкой.
<%@ 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>
Теперь, пишут 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 использует файл <% @ страница isErrorPage = «истина»%> директива, которая говорит компилятор 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>Stack trace:</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>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, он будет производить следующие результаты:
An exception occurred: / by zero
In this chapter. we will discuss how to handle exceptions in JSP. When you are writing a JSP code, you might make coding errors which can occur at any part of the code. There may occur the following type of errors in your JSP code −
Checked exceptions
A checked exception is an exception that is typically a user error or a problem that cannot be foreseen by the programmer. For example, if a file is to be opened, but the file cannot be found, an exception occurs. These exceptions cannot simply be ignored at the time of compilation.
Runtime exceptions
A runtime exception is an exception that probably could have been avoided by the programmer. As opposed to the checked exceptions, runtime exceptions are ignored at the time of compliation.
Errors
These are not exceptions at all, but problems that arise beyond the control of the user or the programmer. Errors are typically ignored in your code because you can rarely do anything about an error. For example, if a stack overflow occurs, an error will arise. They are also ignored at the time of compilation.
We will further discuss ways to handle run time exception/error occuring in your JSP code.
Using Exception Object
The exception object is an instance of a subclass of Throwable (e.g., java.lang. NullPointerException) and is only available in error pages. Following table lists out the important methods available in the Throwable class.
S.No. | Methods & Description |
---|---|
1 |
public String getMessage() Returns a detailed message about the exception that has occurred. This message is initialized in the Throwable constructor. |
2 |
public Throwable getCause() Returns the cause of the exception as represented by a Throwable object. |
3 |
public String toString() Returns the name of the class concatenated with the result of getMessage(). |
4 |
public void printStackTrace() Prints the result of toString() along with the stack trace to System.err, the error output stream. |
5 |
public StackTraceElement [] getStackTrace() Returns an array containing each element on the stack trace. The element at index 0 represents the top of the call stack, and the last element in the array represents the method at the bottom of the call stack. |
6 |
public Throwable fillInStackTrace() Fills the stack trace of this Throwable object with the current stack trace, adding to any previous information in the stack trace. |
JSP gives you an option to specify Error Page for each JSP. Whenever the page throws an exception, the JSP container automatically invokes the error page.
Following is an example to specifiy an error page for a main.jsp. To set up an error page, use the <%@ page errorPage = «xxx» %> directive.
<%@ 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>
We will now write one Error Handling JSP ShowError.jsp, which is given below. Notice that the error-handling page includes the directive <%@ page isErrorPage = «true» %>. This directive causes the JSP compiler to generate the exception instance variable.
<%@ 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>
Access the main.jsp, you will receive an output somewhat like the following −
java.lang.RuntimeException: Error condition!!! ...... Opps... Sorry, an error occurred. Here is the exception stack trace:
Using JSTL Tags for Error Page
You can make use of JSTL tags to write an error page ShowError.jsp. This page has almost same logic as in the above example, with better structure and more information −
<%@ 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>
Access the main.jsp, the following will be generated −
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)
Using Try…Catch Block
If you want to handle errors within the same page and want to take some action instead of firing an error page, you can make use of the try….catch block.
Following is a simple example which shows how to use the try…catch block. Let us put the following code in 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>
Access the main.jsp, it should generate an output somewhat like the following −
An exception occurred: / by zero
Kickstart Your Career
Get certified by completing the course
Get Started
Обработка ошибок
Последнее обновление: 17.09.2018
Файл web.xml позволяет указать, какие страницы html или jsp будут отправляться пользователю при отправке статусных кодов ошибок.
Для этого в web.xml применяется элемент <error-page>.
Внутри этого элемента с помощью элемента <error-code> указывается
статусный код ошибки, который надо обработать. А элемент <location> указывает на путь к
странице html или jsp, которая будет отправляться пользователю.
Например, добавим в проект в папку WebContent новый файл 404.html со следующим кодом:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Not Found</title> </head> <body> <h2>Resource not found!</h2> </body> </html>
В файле web.xml определим следующее содержимое:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> </web-app>
В данном случае элемент error-code указывает, что мы будем обрабатывать ошибки со статусным кодом 404 (то есть такие ошибки,
которые подразумевают отсутствие ресурса на сервере). А элемент location указывает, что в случае обращения к несуществующему ресурсу
пользователю будет отправляться страница 404.html.
Обработка исключений
Кроме настройки обработки стандартных ошибок протокола http,типа 404 или 403, файл web.xml позволяет настроить обработку исключений,
которые могут возникнуть при обработке запроса. Для этого в web.xml применяется элемент <exception-type.
Например, добавим в проект в папку WebContent новый файл error.jsp и определим
в нем следующий код:
<% String message = pageContext.getException().getMessage(); String exception = pageContext.getException().getClass().toString(); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Exception</title> </head> <body> <h2>Exception occurred while processing the request</h2> <p>Type: <%= exception%></p> <p>Message: <%= message %></p> </body> </html>
Данная страница jsp будет отображать информацию об исключении. Через глобальный объект pageContext в страницу передается контекст.
Если при обработке запроса возникло какое-нибудь исключение, то метод pageContext.getException()
возвратит это исключение в
виде объекта Exception. И далее мы можем исследовать этот объект и вызывать его методы, например, получить тип исключения и сообщение об исключении.
Симитируем с сервлете какое-нибудь исключение:
import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/hello") public class HelloServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int x = 0; int y = 8 / x; } }
В данном случае мы получаем ошибку деления на нуль, которая представлена типом java.lang.ArithmeticException.
Теперь определим следующий файл web.xml:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <error-page> <exception-type>java.lang.Throwable</exception-type> <location>/error.jsp</location> </error-page> </web-app>
Элемент exception-type
указывает, что обрабатываться будут исключения типа java.lang.Throwable. Поскольку это базовый класс для всех типов исключений,
то фактически мы будем обрабатывать все исключения. Хотя можно конкретизировать тип исключения, например, указать тот же java.lang.ArithmeticException.
Элемент location
определяет страницу, которая отправляется пользователю при возникновении исключении. В данном случае это
error.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, он должен сгенерировать вывод, похожий на следующий: