スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

LotusScript でAssert を使う

2009年02月13日 00:10

 今日はOpenNTF.orgのCodebinのページから。

LS-ERROR - Minimal Error Handling for Lotus Script (OpenNTF.org)
LS-Error (Documentation)


LotusScriptのエラーハンドリングは色々な方法があるし、開発チームの運用によって色々なニーズがあるのでこういうエラーハンドリングルーチンのようなものを作っている方は多いと思うのですが、なかなか別の開発のときに流用するのは難しいのが現状ではないかと思います。実際このライブラリも便利な機能を持っているのですが、エラーメッセージが英語になったりするので抵抗をもたれる方も多いと思います。なので、ライブラリを眺めてみて面白かったエッセンスの部分だけを紹介したほうが有益かな、と思ったので今日はそんなお話です。

C言語などを勉強された方はAssert文を使用したエラートラップの方法をご存知なのではないでしょうか。簡単に言うと、「成立してはいけない条件式」を指定することによって予期しない処理を防ぐためのものです。If文でも同じことは出来るのですが第三者が見たときにも一発で目的が分かるし、必要があればDebugビルドだけで使用したり出来るので便利だったりします。

今回のライブラリでは、このAssertの関数が含まれていたので試してみましょう。
尚、このLSSファイルはボタンスクリプトでは正しく動かないのでエージェントを新規に作成してみてください。

チュートリアル
1. 新規にデータベースを作ってみてください。テンプレートなしでもかまいません。
2. 新規にエージェントを作ります。
   名前: Error Test (任意の名前を指定してください)
   イベント:アクションメニューから主導で
   対象: なし
3. このページからLSSファイルをダウンロードしておきます。
4.  エージェントペインで右クリックを選択し、「呼び出し」を選択します
5. ダウンロードしたLSSファイルを指定してください。一部書き換えが起こることが確認されますが、OKを選択してください。
6. 以下のようなコードを書いて、エージェントを保存します

Sub Initialize
Dim divisor As Integer
' divisorに初期値の代入忘れ。この場合0で初期化されます。
assert divisor <> 0 , "0で割ることは出来ません"
Msgbox "これは表示されません"
End Sub


7. デザイナーを閉じてサンプルデータベースを開きます。
8. メニューから[アクション]-[Error Test]を選択します。
9. 以下のようなダイアログが表示されます。

   Assertion failed: 0で割ることは出来ません。
at Error Test.INITIALIZE:0


これは代入忘れの変数などがあって0で割ったりすることが無いようなチェックコードを想定している例です。LotusScriptだとデバッグビルドなどは無いので単に可視性の意味のほうが大きいですね。


どんな処理をしているのでしょうか。

Public Sub assert(Byval condition As Integer, message As String)
If condition Then Exit Sub
Stop
Error 1000, formatError(Nothing, {Assertion failed: } & message, Getthreadinfo(10))
End Sub


formaterrorなどはさらに別で定義している関数ですが、エラーメッセージを整形しているだけなのでこの際立ち入ることはしません。
当たり前のように見えますが、以下のような事は参考になると思います。経験のある開発者が読んだらそんなこと言われなくても分かっている!と怒られそうですが。。。

・ Stop関数の利用
 ランタイムエラーが出たときにデバッガを使っていると自動的に止まるので便利ですね。
これもエラーハンドリング関数では付けておくと便利だと思います。当然 ですが、ConditionがTrueのときは止まりません。

・ GetThreadInfo の利用
10はLSI_THREAD_CALLPROC の事なのですが呼び出し元ルーチン名が表示されるように指定しています。
ランタイムエラーハンドリングの関数を作る場合は必ず呼び出し元を作らないと意味が無いですよね。

他にもCatch-Throwのような処理をEmulateするような関数があったりするようなので、使ってみると面白いのではないかと思います。

エラー処理そのものは業務ロジックを含んでいないので、どうしてもこの実装は開発者の良心とか美学だけにかかってしまっているところがあるのですが、エラー処理がしっかりしているアプリケーションは様々な問題が起こっても改修や対応が迅速に行えたり、メンテナンス性は大きく変わるのではないかと思います。是非経験のある開発者が身近におられる方は色々ノウハウを教わってみるといいのではないかと思います。(私も教わりたいくらいです。)


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://hnagasim.blog8.fc2.com/tb.php/88-d4f767b2
    この記事へのトラックバック


    最新記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。