この特集のトップページへ
>
Chapter 2:Component Object Model
2.4.3 COMのエラー処理
以上で,COMコンポーネントの開発方法,および開発したCOMコンポーネントの使い方についてはおわかりいただけたと思う。次に,COMのエラー処理について説明する。
●COMコンポーネントからエラーを発生させるには
COMでエラーを発生させるメカニズムは難しいのであるが,Visual Basicを利用している限り,エラーを発生させたい場所でErrオブジェクトのRaiseメソッドを呼び出し,実行時エラーを発生させるだけですむ。Raiseメソッドの書式は,次のようになっている。
Err.Raise エラー番号, アプリケーション名, エラーメッセージ, _ ヘルプファイル名. ヘルプファイルのコンテキストID
- ・エラー番号
- エラーに対して割り当てる任意の番号を設定する。COMコンポーネントの場合には,0〜65535のあいだで任意のエラーコードを割り当てることができ,その値にvbObjectError定数を加えたものをエラー番号として指定する。ただし,0〜512の範囲はVisual Basicが内部で利用しているものなので,COMコンポーネントで固有のエラーを発生させたい場合には,この範囲の値を使うのは避けたほうがよい。よって,エラー番号には,“適当な番号+513+vbObjectError”を指定する。
- ・アプリケーション名
- COMコンポーネントの名前を指定する。この名前は省略可能で,省略した場合にはプログラムIDの文字列が指定されたものとみなされる。
- ・エラーメッセージ
- エラーメッセージの文字列を指定する。省略可能である。省略した場合には,“アプリケーション定義またはオブジェクト定義のエラーです”という文字列となるが,エラーの発生原因がわかりにくくなるので,極力設定すべきである。
- ・ヘルプファイル名
- もしあるならば,ヘルプファイル名を指定する。
- ・ヘルプファイルのコンテキストID
- ヘルプファイルを指定したとき,そのエラーに対応するコンテキストID(ヘルプの項目番号)を指定する。
たとえば,List 2-4のCOMコンポーネントのプログラムにおいて,Valueプロパティに負の値が代入されたならば,エラーを発生させたいものとする。その場合には,Valueプロパティに値を代入するプロシージャであるLet ValueプロシージャをList 2-7のように変更すればよい。
COMサーバーの開発者とCOMクライアントの開発者が異なるようなケースでは,COMサーバー側で発生し得るエラーコードをPublic宣言した列挙型として宣言しておき,それをErr.Raiseメソッドで発生させるとよい。そうすれば,COMクライアントは,参照設定することで,そのCOMサーバーがどのようなエラーコードを返すのかを知ることができる。
●COMコンポーネントのエラーをCOMクライアントから捕獲するには
COMコンポーネント(より正確には,実体化したCOMオブジェクト)がCOMクライアントに対してエラーを発生させると,それはCOMクライアントからは通常の実行時エラーのように見える。実際,List 2-7の変更をCOMコンポーネントに加えたのち,List 2-6を実行して負の値を設定しようとした場合には,Fig.2-26に示すダイアログボックスが表示される。
Fig.2-26 COMコンポーネントから発生したエラーメッセージ
実行時エラーをCOMクライアントが捕獲するには,On Error Resume Next構文もしくは,On Error GoTo構文を用いる。COMコンポーネントが発生したエラーコードは,ErrオブジェクトのNumberプロパティに格納される。また,アプリケーション名はSourceプロパティに,エラーメッセージは,Descriptionプロパティに格納される。
List 2-6において,COMコンポーネントのエラーを捕獲するには,SetButton_Clickプロシージャを,たとえばList 2-8のように変更する。
List 2-8では,単純にエラー出力をMsgBox関数で表示し,ユーザーに値を設定し直すように促しているだけである(Fig.2-27)。しかし,場合によっては,Err.Numberプロパティを調べ,あまり重要なエラーでなければ,そのまま処理を続行するといった方法も考えられるだろう。
Fig.2-27 List 2-8によるエラーメッセージ処理
ところで,COMクライアント側には,COMコンポーネントで発生させたエラーではなく,システム(のSCMの部分)で発生したエラーも戻される。たとえば,NewキーワードやCreateObject関数を使ってCOMオブジェクトを実体化させようとしたとき,そのCOMコンポーネントがシステムにインストールされていない場合には,当然ながらエラーが発生する。また,COMオブジェクトの実体化に成功したとしても,その後,メソッドの呼び出しやプロパティの参照時にエラーが発生することもある。たとえば,ネットワーク越しのCOMコンポーネントを使っているときに通信エラーが発生した場合には,メソッドの呼び出しやプロパティの参照時にエラーが発生する。つまり,COMコンポーネントの呼び出しでは,COMコンポーネントの開発者が想定した以外のエラーが発生することがあり得るということである。
以上のような理由から,COMコンポーネントを使って堅牢なアプリケーションを構築するためには,COMクライアント側で常にOn Error Resume Next構文やOn Error GoTo構文を使い,エラーを捕獲する癖をつけたほうがよい。
Chapter 2 13/15 |