この特集のトップページへ
Chapter 2:Component Object Model

head2.gif 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コンポーネントから発生したエラーメッセージ

fig2-26.gif

 実行時エラーを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によるエラーメッセージ処理

fig2-27.gif

 ところで,COMクライアント側には,COMコンポーネントで発生させたエラーではなく,システム(のSCMの部分)で発生したエラーも戻される。たとえば,NewキーワードやCreateObject関数を使ってCOMオブジェクトを実体化させようとしたとき,そのCOMコンポーネントがシステムにインストールされていない場合には,当然ながらエラーが発生する。また,COMオブジェクトの実体化に成功したとしても,その後,メソッドの呼び出しやプロパティの参照時にエラーが発生することもある。たとえば,ネットワーク越しのCOMコンポーネントを使っているときに通信エラーが発生した場合には,メソッドの呼び出しやプロパティの参照時にエラーが発生する。つまり,COMコンポーネントの呼び出しでは,COMコンポーネントの開発者が想定した以外のエラーが発生することがあり得るということである。

 以上のような理由から,COMコンポーネントを使って堅牢なアプリケーションを構築するためには,COMクライアント側で常にOn Error Resume Next構文やOn Error GoTo構文を使い,エラーを捕獲する癖をつけたほうがよい。

prevpg.gif Chapter 2 13/15 nextpg.gif