English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
JSP 프로그램을 작성할 때, 프로그래머는 프로그램의 어느 곳에도 나타날 수 있는 몇 가지 버그를 놓칠 수 있습니다. JSP 코드에서 일반적으로 다음과 같은 몇 가지 예외가 있습니다:
이 장에서는 실행 중 예외와 에러를 처리하는 몇 가지 간단하고 우아한 방법을 제공합니다.
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> <% // 에러 페이지를 호출하려면 예외를 throw합니다 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标签来编写错误页面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 블록을 사용하여 어떻게 사용할 수 있는지 보여줍니다. 이 코드를 main.jsp에 넣으세요:
<html> <head> <title>Try...Catch 예제</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에 접근해 보세요. 그 결과는 다음과 같습니다:
예외가 발생했습니다: / zero에 의해