JSP プログラムを作成する場合、プログラマはいくつかのバグを見逃す可能性があり、これらのバグはプログラム内のあらゆる場所に現れる可能性があります。通常、JSP コードには次のタイプの例外があります。
チェック例外: チェック例外は、典型的なユーザー エラー、またはプログラマが予見できないエラーです。たとえば、ファイルを開こうとしているがファイルが見つからない場合、例外がスローされます。これらの例外はコンパイル時に単純に無視することはできません。
実行時例外: プログラマによって実行時例外が回避された可能性があります。この例外はコンパイル時に無視されます。
エラー: ここには例外はありませんが、問題は、それがユーザーまたはプログラマの制御を超えていることです。コード内のエラーは無視されることが多く、それに対してできることはほとんどありません。たとえば、スタック オーバーフロー エラーです。これらのエラーはコンパイル時に無視されます。
このセクションでは、実行時の例外とエラーを処理するためのシンプルかつ洗練された方法をいくつか紹介します。
例外オブジェクトは Throwable サブクラスのインスタンスであり、エラー ページでのみ使用できます。次の表に、Throwable クラスのいくつかの重要なメソッドを示します。
シリアルナンバー | 方法と説明 |
---|---|
1 | public String getMessage() は例外情報を返します。この情報は Throwable コンストラクターで初期化されます。 |
2 | public ThrowablegetCause() は例外の原因を返します。タイプは Throwable オブジェクトです |
3 | public String toString() はクラス名を返します |
4 | public void printStackTrace() は、例外スタック トレースを System.err に出力します。 |
5 | public StackTraceElement [] getStackTrace() は、例外スタック トレースをスタック トレース要素の配列の形式で返します。 |
6 | public ThrowablefillInStackTrace() は、現在のスタック トレースを使用して 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("エラー条件!!!") } %></body></html>
次に、ShowError.jsp ファイルを次のように記述します。
<%@ page isErrorPage="true" %><html><head><title>エラー ページを表示</title></head><body><h1>問題...</h1><p>申し訳ありませんが、エラーが発生しました。</p><p>例外スタック トレースは次のとおりです: </p><pre><%例外.printStackTrace(response.getWriter());
ShowError.jsp ファイルでは <%@page isErrorPage="true"%> ディレクティブが使用されており、これにより例外インスタンス変数を生成する必要があることが JSP コンパイラに通知されることに注意してください。
ここで main.jsp ページにアクセスしてみると、次の結果が生成されます。
java.lang.RuntimeException: エラー状態!!!....おっと...申し訳ありませんが、エラーが発生しました。例外スタック トレースは次のとおりです。
JSTL タグを使用して、エラー ページ ShowError.jsp を記述することができます。この例のコードは、前の例のコードとほぼ同じロジックを持っていますが、この例のコードはより適切に構造化されており、より多くの情報を提供します。
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%@page isErrorPage="true" %><html><head><title>エラー ページを表示</title></head><body><h1>問題...</h1><table><tr valign="top"><td><b>エラー:</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>ステータスコード:</b></td><td>${pageContext.errorData.statusCode}</td></tr><tr valign="top"><td><b>スタック トレース:</b> </td><td><c:forEach var="trace" items="${pageContext.例外.stackTrace}"><p>${trace}</p></c:forEach></td></tr></table></body></html>
実行結果は次のとおりです。
ページに例外処理を配置し、異なる例外を異なる方法で処理する場合は、try...catch ブロックを使用する必要があります。
次の例は、このコードを main.jsp に配置して try...catch ブロックを使用する方法を示しています。
<html><head> <title>試してみましょう</title></head><body><% try{ int i = 1; i = i / 0; + i); } catch (Exception e){ out.println("例外が発生しました: " + e.getMessage()) } %></body></html>
main.jsp にアクセスしてみると、次の結果が生成されます。
例外が発生しました: / ゼロ