JSP例外処理


JSP プログラムを作成するとき、プログラマはいくつかのバグを見逃す可能性があり、これらのバグはプログラム内のあらゆる場所に現れる可能性があります。通常、JSP コードには次のタイプの例外があります。

  • チェック例外: チェック例外は、典型的なユーザー エラー、またはプログラマが予見できないエラーです。たとえば、ファイルを開こうとしているがファイルが見つからない場合、例外がスローされます。これらの例外はコンパイル時に単純に無視することはできません。

  • 実行時例外: 実行時例外はプログラマによって回避された可能性があり、この例外はコンパイル時に無視されます。

  • エラー: ここには例外はありませんが、問題は、それがユーザーまたはプログラマの制御を超えていることです。コード内のエラーは無視されることが多く、それに対してできることはほとんどありません。たとえば、スタック オーバーフロー エラーです。これらのエラーはコンパイル時に無視されます。

このセクションでは、実行時の例外とエラーを処理するためのシンプルで洗練された方法をいくつか紹介します。


例外オブジェクトの使用

例外オブジェクトは Throwable サブクラスのインスタンスであり、エラー ページでのみ使用できます。次の表は、Throwable クラスのいくつかの重要なメソッドを示しています。

戻る珍しい情報。この情報は Throwable コンストラクターで初期化されます2
public ThrowablegetCause()例外の原因を返します。型は Throwable オブジェクトです
3public String toString()


クラス名を返す
4public void printStackTrace()


System.errに例外スタックトレースを出力
5public StackTraceElement [] getStackTrace()


スタック トレース要素の配列の形式で例外スタック トレースを返します
6public ThrowablefillInStackTrace()


現在のスタック トレースを使用して Throwable オブジェクトを埋めます

JSP には、JSP ページごとにエラー ページを指定するオプションが用意されています。ページが例外をスローするたびに、JSP コンテナは自動的にエラー ページを呼び出します。

次の例では、main.jsp のエラー ページを指定します。 <%@page errorPage="XXXXX"%> ディレクティブを使用してエラー ページを指定します。

<%@ page errorPage="ShowError.jsp" %>

<html>
<head>
   <title>Error Handling Example</title>
</head>
<body>
<%
   // Throw an exception to invoke the error page
   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()); %>

このディレクティブは、JSP コンパイラに <%@page isErrorPage="true"%> ディレクティブを使用していることに注意してください。例外インスタンス変数を生成します。

ここで 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>Stack trace:</b></td>
<td>
<c:forEach var="trace" 
         items="${pageContext.exception.stackTrace}">
<p>${trace}</p>
</c:forEach>
</td>
</tr>
</table>
</body>
</html>

実行結果は次のとおりです:

jsp-exeception-1.jpg


try...catch ブロックの使用

例外処理を 1 つのページにまとめて、異なる例外を異なる方法で処理したい場合は、try...catch ブロックを使用する必要があります。

次の例は、try...catch ブロックを使用して、このコードを main.jsp に配置する方法を示しています:

<html>
<head>
   <title>Try...Catch Example</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 にアクセスしようとすると、次の結果が生成されます:

An exception occurred: / by zero