2008-07-01

Jaxer のエラーハンドリング runat="server-proxy" 編

Jaxer のエラーハンドリング runat="server" 編
サーバサイドでエラーが起きたとき、Aptana Jaxer がどのように振る舞うか調べてみましたので、その結果をお伝えします。Jaxer でサーバサイドのコードを実行するタイミングには runat="server" と runat="server-proxy" がありますが、今回は runat="server" を対象とします。
今回は runat="server-proxy" でエラーが起きたとき、Aptana Jaxer がどのように振る舞うか調べてみました。

runat="server" と同じように runat="server-proxy" で、サーバサイドで例外をスローするコードを用意しました。

<script type="text/javascript" runat="server-proxy">
//<![CDATA[
function foo1(value) {
throw 'ERROR!;'
}
//]]>
</script>

そして、次のとおり、クライアントサイドからサーバサイドを実行してみたところ、次のような Alert が表示されました。

<script type="text/javascript">
//<![CDATA[
foo1('bar1');
//]]>
</script>



クライアントサイドからサーバサイドを非同期で実行しても、同じように Alert が表示されました。

<script type="text/javascript">
//<![CDATA[
foo1Async(function(v) {}, 'bar1');
//]]>
</script>

Alert のメッセージは、エラーの具体的な内容を表すので、そのまま見せると不都合なことがあります。そのときは、Config.DISPLAY_ERRORS = false; とすることで、メッセージを固定にして、エラーの内容を伏せることができます。その固定のメッセージは Config.CALLBACK_ERROR_MESSAGE もしくは Config.CALLBACK_FATAL_ERROR_MESSAGE で指定できます。

Alert を表示しないで、ソースコードでエラーを判別する選択もできます。そのときは、Config.ALERT_CALLBACK_ERRORS = false; とします。

クライアントサイドからサーバサイドを同期で実行するときは、例外をキャッチすることで、サーバサイドのエラーをハンドリングできます。

<script type="text/javascript">
//<![CDATA[
try {
foo1('bar1');
} catch (e) {
console.log(e);
}
//]]>
</script>

クライアントサイドからサーバサイドを非同期で実行するときは、エラーのコールバック関数を指定することで、サーバサイドのエラーをハンドリングできます。成功とエラーのコールバック関数を配列で指定します。

<script type="text/javascript">
//<![CDATA[
foo1Async([
function(v) { console.log(v); }, // 成功
function(e) { console.log(e); } // エラー
], 'bar1');
//]]>
</script>

また、成功と失敗のコールバック関数は、オブジェクトとしても指定できます。

<script type="text/javascript">
//<![CDATA[
foo1Async({
callback: function(v) { console.log(v); }, // 成功
errorHandler: function(e) { console.log(e); } // エラー
}, 'bar1');
//]]>
</script>

0 件のコメント: