例外処理

例外とは、サーブレット内で検出されたエラーのことです。例外は、サーブレットがフォームデータを処理するときなどランタイムで発生することも、JSP をプリコンパイルするときなどコンパイル時に発生することもあります。Web アプリケーションを運用開始する前に、コンパイル時の例外をキャッチする必要があります。このセクションでは、サーブレットと JSP でランタイムの例外を処理する方法を説明します。

Java サーブレットでは、例外はクラス javax.servlet.ServletException のインスタンスで表されます。

WEB-INF/web.xml ファイルの error-page 要素を使用すると、Web アプリケーションがエラーを処理する方法を定義できます。error-page 要素を SERVER-INF/default-web.xml ファイルに追加することで、JRun サーバのすべての Web アプリケーションに関してエラー処理を定義することもできます。

次のセクションで説明されているように、error-page 要素で、例外タイプ別やエラーコード別に例外を定義します。web.xml ファイル内のこれらの要素の順序によって、エラーハンドラが決まります。JRun は、error-codeexception-type と一致する最初の error-page 要素で指定された位置にエラー処理を転送します。

Java 例外処理

web.xml ファイルの error-page の exception-type サブ要素によって、サーブレットの処理中に投げられた Java 例外を JRun が処理する方法が決まります。

exception-type に対して完全修飾の Java エラーを定義し、そのエラーを location 要素内で送信先にマッピングします。次の例では、FileNotFound 例外を 404.jsp ページにマッピングします。

<error-page>
  <exception-type>java.io.FileNotFoundException</exception-type>
  <location>/error-pages/404.jsp</location>
</error-page>

HttpServletRequest オブジェクトと HttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。詳細については、 「エラー属性へのアクセス」 を参照してください。

HTTP エラーコードの処理

web.xml ファイルの error-page の error-code サブ要素によって、サーブレットの処理中に生成された HTTP エラーコードを JRun が処理する方法が決まります。

error-code 要素のために HTTP ステータスコードを定義し、そのコードを location 要素で転送先にマッピングします。次の例では、HTTP 500 (内部サーバエラー) ステータスコードを servererror.jsp ページにマッピングします。

<error-page>
  <error-code>500</error-code>
  <location>/error-pages/servererror.jsp</location>
</error-page>

次の表に、一般的なエラー関連 HTTP ステータスコードをリストします。
HTTP エラーコード
説明
400
不正なリクエスト
401
無許可
403
禁止
404
発見できず
408
リクエストタイムアウト
500
内部サーバエラー

エラーコードの完全なリストについては、HTTP 1.1 RFC (http://www.ietf.org/rfc/rfc2616.txt ) をご覧ください。

HttpServletRequest オブジェクトとHttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。詳細については、 「エラー属性へのアクセス」 を参照してください。

エラー属性へのアクセス

HttpServletRequest オブジェクトとHttpServletResponse オブジェクトによってエラー情報にアクセスできるので、役に立つデバッグ情報や目的の例外ハンドラを生成できます。

エラーが投げられると、JRun はいくつかの属性を request オブジェクトに設定します。次の表で、これらの属性を説明します。
属性
説明
javax.servlet.error.status_code
当てはまる場合は、HTTP エラーコードを int
オブジェクトとして定義します。サーブレットが、HTTP と関連しない例外を投げた場合は、ステータスコードは通常 500 (内部サーバエラー) に設定されます。
javax.servlet.error.message
例外やエラーメッセージを返します。
javax.servlet.error.exception_type
例外のタイプを定義します。
javax.servlet.error.exception
投げられる実際の例外を定義します。printStackTrace メソッドを使用すると、
例外のスタックトレースを表示できます。
javax.servlet.error.request_uri
例外が投げられる前に、リクエスト URI を定義
します。

次のコード例では、request オブジェクトからエラー属性を取得し、スタックトレースを含めてそれらをブラウザで表示します。

...
Object status_code = 
req.getAttribute("javax.servlet.error.status_code");
Object message = req.getAttribute("javax.servlet.error.message");
Object error_type = 
req.getAttribute("javax.servlet.error.exception_type");
Throwable throwable = (Throwable) 
req.getAttribute("javax.servlet.error.exception");
Object request_uri = 
req.getAttribute("javax.servlet.error.request_uri");
out.println("<HTML><BODY>");
out.println("<B>ステータスコード:</B> " + status_code.toString());
out.println("<BR><B> メッセージ</B>:" + message.toString());
out.println("<BR><B>エラータイプ</B>:" + error_type.toString());
out.println("<BR><B>リクエスト URI</B>:" + request_uri.toString());
out.println("<HR><PRE>");
if (throwable != null) {
  throwable.printStackTrace(out);
}
...

次に示すように、web.xml ファイルでは、エラーハンドラの場所とエラーハンドラが処理するエラーのタイプが定義されます。

<error-page>
  <exception-type>javax.servlet.ServletException</exception-type>
  <location>/servlet/ErrorHandler</location>
</error-page>

エラーを生成してこの例をテストするために、次のように数を 0 で除算する式を含む JSP を作成します。

<%= 42/0 %>

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