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

JSP 예외 처리

JSP 프로그램을 작성할 때, 프로그래머는 프로그램의 어느 곳에도 나타날 수 있는 몇 가지 버그를 놓칠 수 있습니다. JSP 코드에서 일반적으로 다음과 같은 몇 가지 예외가 있습니다:

  • 체크형 예외: 체크형 예외는 유저 오류나 프로그래머가 예측할 수 없는 오류입니다. 예를 들어, 파일을 열려고 했지만 파일을 찾을 수 없을 때 예외가 발생합니다. 이러한 예외는 컴파일 시에 단순히 무시할 수 없습니다.
  • 실행 중 예외: 실행 중 예외는 프로그래머가 피할 수 있는 가능성이 있습니다. 이 예외는 컴파일 시에 무시됩니다.
  • 에러: 에러는 예외가 아니지만, 사용자나 프로그래머의 제어 범위를 벗어났습니다. 에러는 일반적으로 코드에서 무시됩니다. 예를 들어, 스택 오버플로우 에러와 같은 이러한 에러는 컴파일 시에 무시됩니다.

이 장에서는 실행 중 예외와 에러를 처리하는 몇 가지 간단하고 우아한 방법을 제공합니다.

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>
<%
   // 에러 페이지를 호출하려면 예외를 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标签

可以利用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("The answer is "); + i);
   }
   catch (Exception e){
      out.println("An exception occurred: "); + e.getMessage());
   }
%>
</body>
</html>

main.jsp에 접근해 보세요. 그 결과는 다음과 같습니다:

예외가 발생했습니다: / zero에 의해