エラーの処理

JSP には強固なエラー処理能力が備わっています。try-catch ブロックなど、Java コードのあらゆるエラー処理テクニックを使用できます。JSP 用に特別に設計されたテクニックも使用できます。

JSP のエラーは、次に示す JSP ライフサイクルの 2 つのポイントで発生します。

コンパイル時エラーとランタイムエラーの違いを理解する必要があります。

ランタイムエラーのキャッチ

ランタイムエラー情報には次の方法でアクセスできます。

このセクションでは、これらの方法について説明します。

exception オブジェクトの処理

ランタイムエラーは、エラーを生成した JSP 内でキャッチし処理できます。次の例に示すように、page ディレクティブを使用してエラーページを指定することもできます。このページは例外を処理する別の JSP です。

<%@ page errorPage="errhand.jsp"%>
<html><head><title>エラーを発生させるページ</title></head><body>
<%
 int zero = 0;
 int x = 42/zero;
%>
</body></html>

キャッチされない例外が JSP から投げられると、その JSP によって、その例外とクライアントリクエストが errorPage 属性で指定されたページに転送されます。

エラーページとして使用する JSP は、JSP のディレクティブを使用して isErrorPage 属性を true に設定する必要があります。JSP がエラーを生成し、エラーページに転送するとき、エラーページの JSP exception オブジェクトを、生成されたエラーに設定します。

次のコードに示すように、exception オブジェクトを使用して、エラー、エラーメッセージ、スタックトレースの簡単な説明にアクセスできます。

<%@ page isErrorPage="true" %>
<html><head>  <title>エラーハンドラ</title></head><body>
大変です。500 エラーページ<p><table border=1>
<tr>
  <td><strong>エラーメッセージ</strong></td>
  <td><%= exception.getMessage() %></td>
</tr>     
<tr>
  <td><strong>例外を文字列に変換</strong></td>
  <td><%= exception.toString() %></td>
</tr>
<tr>
  <td><strong>スタックトレース</strong></td>
  <td>
<%
  exception.printStackTrace(new java.io.PrintWriter(out));  
%>
</td></tr> 
</table></body></html>

page ディレクティブの詳細については、 「page ディレクティブ」 を参照してください。exception オブジェクトの詳細については、 「exception オブジェクト」 を参照してください。

エラー属性の処理

page ディレクティブ内でエラーページを指定しなかった場合は、キャッチされない例外が発生すると、JRun は、エラーステータスコード 500 (サーバエラー) をクライアントに返します。

次の例に示すように、このタイプのエラーは、web.xml ファイル内の error-page 要素を使用してキャッチできます。

<error-page>  
  <error-code>500</error-code>  
  <location>/errhand.jsp</location> 
</error-page>

実行時にエラーが投げられると、JRun は、exception 属性を request オブジェクトに設定し、そのオブジェクトを web.xml ファイル内で定義したエラー処理ページに転送します。

次の表で、javax.servlet.error で始まる名前を持つエラー属性を説明します。
属性
説明
message
エラーメッセージを表す文字列。
status_code
エラーのステータスコードを表す整数。
exception_type
投げられた例外のタイプ。
request_uri
例外を投げたページのリクエスト URI を表す文字列。
servlet_name
例外を投げたサーブレットの名前を表す文字列。

次の例では、エラー属性を出力する HTML テーブルを表示します。

<html><head><title>エラーハンドラ</title></head><body>
<H2>大変です。500 エラーページ</H2>
<p><table border=1>
<tr>
  <td><b>ステータスコード</b></td>
  <td><%= request.getAttribute("javax.servlet.error.status_code") %></td>
</tr> 
<tr>
  <td><b>例外のタイプ</b></td>
  <td><%= request.getAttribute("javax.servlet.error.exception_type") 
%></td>
</tr> 
<tr>
  <td><b>メッセージ</b></td>
  <td><%= request.getAttribute("javax.servlet.error.message") %></td>
</tr>
<tr>
  <td><b>例外</b></td>
  <td><%= request.getAttribute("javax.servlet.error.exception") %></
td>
</tr>
<tr>
  <td><b>URI</b></td>
  <td><%= request.getAttribute("javax.servlet.error.request_uri") 
%></td>
</tr>
<tr>
  <td><b>サーブレット名</b></td>
  <td><%= request.getAttribute("javax.servlet.error.servlet_name") 
%></td>
</tr>
</table>
</body></html>

サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。

コンパイル時エラーのキャッチ

JSP を JSP ソースファイルから Java クラスファイルに変換する処理は、まず JRun がこのファイルへの最初のリクエストを受け取ったときに発生します。その後の変換は、ページが最後に変換されてから JSP ソースコードファイルが修正されたと JRun が判断したときに行われます。

変換が失敗すると、クライアントリクエストが失敗し、対応するエラーが投げられます。たとえば、JRun が変換エラーを検出すると、JRun からエラーステータスコード 500 (サーバエラー) を返します。

ユーザーがページをリクエストするまで、使用中のページにコンパイル時エラーがあることに開発者が気付かないことがあります。その JSP は正しくコンパイルされないので、開発者がコンパイル時エラーを投げるようにした場合でも、page ディレクティブ内の errorPage 属性でそのエラーは処理されません。そのかわりに JRun がコンパイラエラーを投げます。500 エラーはやはりそのページをリクエストしているクライアントに返されますが、エラー処理の方法は異なります。

JSP でコンパイル時エラーをキャッチするには、次の例に示すように、web.xml ファイル内で error-page 要素を使用します。

<error-page>
  <error-code>500</error-code>
  <location>/exception500.jsp</location>
</error-page>

コンパイル時の JSP エラーを防止するには JSP をプリコンパイルします。JSP のプリコンパイルの詳細については、『JRun アセンブルとデプロイガイド』を参照してください。

サンプルの JSP を表示するには、samples JRun サーバを起動し、ブラウザで
http://localhost:8200/techniques を開きます。