サーバ側のJavaオブジェクトが処理中に例外を発生させた場合に、クライアントの画面上にはアラートが表示されます。これはデフォルトの例外処理の仕組みによるものですが、この例外発生時の処理を独自のものに変更することができます。今回のサンプルではその方法を紹介します。
サンプルでは、発生した例外クラスの名称と例外クラスが保持しているエラーメッセージを画面に表示しています。

それではサーバのリモートオブジェクトのソースコードを見てみます。
「ExceptionTest.java」
package myajax.exception;
public class ExceptionTest {
private boolean flag = true;
public void throwException() throws Exception
{
if(flag)
{
flag = false;
throw new NullPointerException("NullPointerExceptionが発生しました!");
}
else
{
flag = true;
throw new NumberFormatException("NumberFormatExceptionが発生しました!");
}
}
}
「NullPointerException」と「NumberFormatException」を交互に発生させるシンプルなクラスです。次にクライアント側のHTMLコードです。
「exception.html(一部抜粋)」
function catchException() {
Exception.throwException({
callback:function() {},
exceptionHandler:function(msg,ex)
{
dwr.util.setValue("classname", ex.javaClassName);
dwr.util.setValue("msg", ex.message);
}
});
}
「exceptionHandler」に、例外を処理するための関数を設定します。関数の第2引数に渡される連想配列は「javaClassName」という例外クラスの名称を持つ要素と、「message」という例外のメッセージを持つ要素を持っています。サンプルではこの2つの要素の値を画面に表示しています。次に「dwr.xml」の設定を見てみます。
「dwr.xml」
<create creator="new" javascript="Exception" scope="script">
<param name="class" value="myajax.exception.ExceptionTest" />
</create>
<convert match="java.lang.Exception" converter="exception"/>
まず、前回までと同じようにリモートオブジェクトを定義する「create」タグを記述しています。「ExceptionTest」クラスは発生させる例外を交互に切り替えるためのフラグをインスタンス変数として持っているので、スコープには「script」を適用しています。
次に例外クラスをコンバートするための「convert」タグを定義しています。このタグを指定しない場合、一律、「javaClassName」には「java.lang.Throwable」が、「message」には「Error」が設定されます。match属性には例外クラスの最上位クラスであるExceptionを指定しています。このように指定することで全ての例外クラスがコンバートされます。発生する例外毎に扱う属性を変更する場合には「match属性」に個別のクラス名を指定し、複数「convert」タグを定義します。
例外クラスの属性は上記「javaClassName」、「message」の以外にもJavaBeanの仕様に則った属性についてはアクセスすることが出来ます。(実は例外クラスをコンバートする「ExceptionConverter」は「BeanConverter」を継承しているのです。)
※「javaClassName」はExceptionクラスのプロパティではなく、ExceptionConverterが独自に追加している属性です。
以下のサンプルでは例外クラスの「StackTrace」プロパティからトレースを取得し、Webページに表示しています。

「exception2.html(一部抜粋)」
Exception.throwException({
callback:function() {},
exceptionHandler:function(msg,ex)
{
dwr.util.setValue("classname", ex.javaClassName);
dwr.util.setValue("msg", ex.message);
trace = "<br>";
for(i=0;i<ex.stackTrace.length;i++)
{
trace = trace + "at " + ex.stackTrace[i].className +
"." + ex.stackTrace[i].methodName + "(" + ex.stackTrace[i].fileName +
":" + ex.stackTrace[i].lineNumber + ")" + "<br>";
}
dwr.util.setValue("stacktrace", trace,{escapeHtml:false});
}
});
配列に格納されている「StackTrace」クラスのプロパティを取得しています。上記が動作するためには「dwr.xml」に以下を追加する必要があります。
<convert match="java.lang.StackTraceElement" converter="bean"/>
「BeanConverter」に「StackTrace」クラスをコンバートするように指示しています。DWRの世界では、コンバートタグを指定さえすれば、ほとんどのクラスを扱うことが可能なのです。
ちょっと一休み. Javaキーワード並び替えゲーム
画面に表示される文字列を並び替えるとJavaに関連するキーワードになります。ヒントをたよりに並び替えを行ってエンターを押してください。
ユーザ登録をしてログインするとランキングに参加できます。