カテゴリー
VB6

例外処理はどれがベストなのか?

.NETのご時世にVB6の話題ばかり次々と追加です。
意外とVB6を見ることで、.NETが見えてくることもあって無駄ではないとは思いますけどね。
今でもなんか悩むことが多いVB6の例外処理です。

うちの開発部隊では、
・Subは使わない。Functionで戻り値を必ず返すようにする
・戻り値に成功、不成功などを返す(例外を必ず関数内で処理する)
という決まりになっています。
ただ、これだと面倒な場面が出てくるんですよね。
たとえば、メソッドの呼び出し先でさらにメソッドを呼び出しということをやっていて、深いところで、ユーザーに詳細な情報を通知したいエラーが出た場合です。
これに対応するには、エラープロパティーみたいなものを用意し、エラーが起きたときにプロパティーに情報をセットし、Falseを返すようにし、呼び出し元はFalseで結果が帰ったときはそのプロパティーをみるような形になるんでしょうね。
バケツリレー的に情報を呼び出し元に返して、ユーザーインターフェースを受け持つクラスでメッセージを表示するという形になるのでしょう。
または、戻り値を数値型にしてエラーコードを返すとか。
ただ、エラーコードの場合は呼び出し元でエラーコードに応じてメッセージを作る必要があり、そもそもこのコードとメッセージの対応付けを作るのが面倒なので、だいたい手抜きして「なんらかのエラーが発生しました」みたいな片づけ方をしてしまうこともしばしばあったりとか・・・
こうするとすべての関数呼び出しにIF文が必要になり、かなりソースが煩雑なことになってきます。しまいには関数を作るのが面倒になって、一つの長い関数にしたりとか・・・
ただ、VB6の場合、On Error Resume Nextというエラーを無視する命令があるので、例外が起きた(または自分でを起こした)としても、無視されてしまう危険があります。
まあ、On Error Resume Nextを使わないと決めておけばいいんでしょうけどね。
(ところが使わないと判断できない所もあるので、使わないわけにもいかない)
あと、VBのString型にはNull値という定義がないので、String型の引数を返す関数だと戻り値ではエラーが判断できません。String型には文字列は何でも入るわけですからエラーコードで返すわけにはいかないからですね。
ただ、Variant型にはエラー値という特別な値を入れることが出来ます。
なんか、VB6ってとにかくVariantを使えという思想が所々に見られてやな感じです(笑)
Variant型に関する機能っていろいろ充実してますしね。
ま、こんな感じなので私は会社の決まりに反して場合によっては例外を発生させてる時があります。上のString型を返す関数や、詳細エラーを返したい関数の場合です。
今のところ、この併用がベストのような感じがします。
#関連図書(鈴木様、情報ありがとうございます)
vb6_error_coding.jpg
Visual Basic6エラーコーディング―生産性と品質を高める戦略とテクニック(Amazon)

この記事を書いた人: A-tak

A-tak.com(えいたっく どっとこむ)の管理人。
Apple野郎なおっさんでしたが、Windowsに出戻り。最近はまっているのはハンターカブというバイクとBlackmagic Pocket Cinemaでの動画撮影です。
A-tak.comは2002年2月から運営(前身のサイトは1999年3月から)。今年で20年!

Youtube / Twitter

コメントは受け付けていません。