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

JSP エラーハンドリング

JSPプログラムを書く際には、プログラマーがBUGを漏らすことがあります。これらのBUGはプログラムのどこにでも現れる可能性があります。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>
<%
   // エラーページを呼び出すために例外を投げます
   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>ごめんなさい、エラーが発生しました。/p>
<p>例外のスタックトレースが以下の通りです:/p>
<pre>
<% exception.printStackTrace(response.getWriter()); %>

ShowError.jspファイルが<%@page isErrorPage="true"%>指令を使用していることに注意してください。この指令はJSPコンパイラに例外サンプル変数を生成する必要があることを伝えます:

今、main.jspページにアクセスしてみましょう。以下のような結果が得られます:

java.lang.RuntimeException: Error condition!!!
......
Opps...
ごめんなさい、エラーが発生しました。
例外のスタックトレースが以下の通りです:

エラーページで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