CRSは、JavaScriptとほぼ同じようにtry…catchにより例外をハンドリングすることができます。
try { 実行文1 } catch (e) { 実行文2 }
tryブロックで囲まれた実行文1を実行し、その実行過程で例外が発生した場合、後続の実行文1にステートメント実行を中止し、実行文2に制御を移します。
catchステートメントの仮引数 e は、Exceptionオブジェクトが渡されます。Exceptionオブジェクトのプロパティによりどのような例外が発生したか知ることができます。
e.Message エラーメッセージ e.Method 例外を起こした機能分類 e.Code 例外コード
例
try { var a = foo1(1); var b = foo2(2); var c = foo3(3); } catch (e) { print("例外", e.Message, "が発生しました\n"); }
catchブロック内で、引数のないthrow文を実行するかcatch文で受け取ったExceptionオブジェクトをthrowすることにより、catchが受け取った例外を上位のブロックにスローすることができます。
try { var a = foo1(1); var b = foo2(2); var c = foo3(3); } catch (e) { if (e.Method == "DOM") { print("DOM例外", e.Message, "が発生しました\n"); } else { throw e; } }
try … catch による例外ハンドリングは実行時のみ有効です。Biz/Designerで生成されるCRSファイル全体をtryブロックに入れても、イベントハンドラの実行により発生した例外は捕らえることができないことに注意してください。
try { ←tryブロック開始 Form form1 { Width = 100; Height = 100; : Function OnTouch(e) { : throw new Exception("app", 1, "test"); : } } } ← tryブロック終了 catch (e) { print(e.Message, "\n"); }
この例では、Form全体をtryブロックに入れていますが、このtryブロックはformの生成時に発生する例外は捕捉されますが、Formの生成が終わるとtryブロックを抜けてしまうため、OnTouchイベントハンドラ内で発生する例外は捕らえることはできません。
OnTouchで発生する例外を捕らえるためには次のように記述します。
Form form1 { Width = 100; Height = 100; : Function OnTouch(e) { try { ←tryブロック開始 : throw new Exception("app", 1, "test"); : } ← tryブロック終了 catch(e) { print(e.Message, "\n"); } } }
Exceptionオブジェクトを生成し、throw文に渡すことでアプリケーション固有の例外を発生させることができます。
例
Function foo (a) { if (a == 0) { throw new Exception("app", 5, "引数が0です"); } return 100 / a; }
Exceptionオブジェクトのコンストラクタには、以下の値を渡します。
第1パラメータ:例外の種類を指定します。Methodプロパティの値となります。
第2パラメータ:例外番号を指定します。Codeプロパティの値となります。
第3パラメータ:説明文を指定します。Messageプロパティの値となります。
Biz/Browser ver4.0.0より拡張されたエラーハンドリング機構です。"//"(Rootオブジェクト)にOnExceptionファンクションを定義することで、catchされない全ての例外を捕捉して呼び出されます。
: // { Function OnException(e) { MessageBox("エラーが発生しました。管理者に連絡してください"); Login("http://server/startup.crs"); return false; } } :
OnExceptionハンドラは、アプリケーション固有のエラー報告手段を提供するために用意された機能で、通常はユーザに対してエラーを報告して終了します。OnExceptionハンドラに制御が渡った時点で、実行途中のコールスタックは全て解放されているので、エラーを起こしたスクリプトの処理を継続させることはできません。
また、OnExceptionの処理中に別の例外が発生した場合、Biz/Browserに内蔵されているエラーハンドラが実行されます。
OnException関数がtrueを返した場合、CRSインタプリタはセッションを維持したまま処理を継続します。true以外を返した場合、CRSインタプリタはセッションをリセットして停止します。
処理の継続が可能な例外は、個々の処理の中でtry ... catchにより捕捉してOnExceptionに制御が渡らないようにしてください。OnExceptionが実行される局面では、例外の発生した位置や内容が特定できませんので、画面が正常に表示されていなかったり、オブジェクトの生成が途中で停止しているなど意図しない状態に陥っている可能性があります。OnExceptionはエラー報告を行った後、処理を停止するかLogin()メソッドによりセッションをリセットしてアプリケーションを再起動することを推奨します。