Jsp-exception-handling
JSP-例外処理
この章では。 JSPで例外を処理する方法について説明します。 JSPコードを記述しているときに、コードの任意の部分で発生する可能性のあるコーディングエラーが発生する可能性があります。 あなたのJSPコードで次のタイプのエラーが発生する可能性があります-
チェック済みの例外
チェック例外は、通常はユーザーエラーまたはプログラマが予測できない問題である例外です。 たとえば、ファイルを開く必要があるが、ファイルが見つからない場合、例外が発生します。 これらの例外は、コンパイル時に単に無視することはできません。
ランタイム例外
ランタイム例外は、おそらくプログラマーによって回避された可能性のある例外です。 チェック例外とは対照的に、コンパイル時にはランタイム例外は無視されます。
エラー
これらは例外ではありませんが、ユーザーまたはプログラマーの制御を超えて発生する問題です。 通常、エラーについては何も実行できないため、コード内のエラーは無視されます。 たとえば、スタックオーバーフローが発生すると、エラーが発生します。 また、コンパイル時には無視されます。
JSPコードで発生する実行時例外/エラーを処理する方法についてさらに説明します。
例外オブジェクトの使用
例外オブジェクトは、Throwableのサブクラスのインスタンスです(java.langなど)。 NullPointerException)およびエラーページでのみ使用可能です。 次の表に、Throwableクラスで使用できる重要なメソッドを示します。
S.No. | Methods & Description |
---|---|
1 |
public String getMessage() 発生した例外に関する詳細メッセージを返します。 このメッセージは、Throwableコンストラクターで初期化されます。 |
2 |
public Throwable getCause() Throwableオブジェクトで表される例外の原因を返します。 |
3 |
public String toString()
|
4 |
public void printStackTrace() エラー出力ストリームである System.err へのスタックトレースと共に* toString()*の結果を出力します。 |
5 |
public StackTraceElement [] getStackTrace() スタックトレースの各要素を含む配列を返します。 インデックス0の要素は呼び出しスタックの一番上を表し、配列の最後の要素は呼び出しスタックの一番下のメソッドを表します。 |
6 |
public Throwable fillInStackTrace() このThrowableオブジェクトのスタックトレースを現在のスタックトレースで満たし、スタックトレース内の以前の情報に追加します。 |
JSPには、JSPごとに*エラーページ*を指定するオプションがあります。 ページが例外をスローするたびに、JSPコンテナはエラーページを自動的に呼び出します。
以下は、 main.jsp のエラーページを指定する例です。 エラーページを設定するには、 <%@ page errorPage = "xxx"%> ディレクティブを使用します。
<%@ 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>
次に、1つのエラー処理JSP ShowError.jspを記述します。これは以下に示します。 エラー処理ページにディレクティブ <%@ page isErrorPage = "true"%> が含まれていることに注意してください。 このディレクティブにより、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()); %></pre>
</body>
</html>
*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>
main.jspにアクセスすると、以下が生成されます-
Opps...
Error: | java.lang.RuntimeException: Error condition!!! |
URI: | /main.jsp |
Status code: | 500 |
Stack trace: |
org.apache.jsp.main_jsp._jspService(main_jsp.java:65) org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:68) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:265) javax.servlet.http.HttpServlet.service(HttpServlet.java:722) |
Try … Catchブロックの使用
同じページ内でエラーを処理し、エラーページを起動する代わりに何らかのアクションを実行する場合は、 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