VBAのエラートラップ、なにがいい形なのかいまいち定まっていなかったのですが、今のところ自分の行き着いた方法です
VBAでも、クラス設計をしっかりめにして書くのがマイブームです
エラーが発生したときにかんがえたいことは
- ログへエラー情報を出力したい
- フォーム上にエラーメッセージを表示したい
- エラー情報をメール通知したい
などです。
そのほかには
- エラーがどこで発生したのか?エラーの発生場所(クラスやメソッド)を知りたい。
- どの経路で呼び出した結果、エラーが発生したの?
などです。
こんな感じで書くことに決めています。
- クラス内のエラートラップは、全て呼び出し元へスローしてしまう
- Erra.RaiseのSouceに、Err.Souce & ">" & "クラス名.メソッド名"を入れてスローする
呼び出し元
private mc_MODNAME="MAIN"
pubilc sub Yobidasimoto()
const cnsPROCNAME="Yobidasimoto"
dim modProcName as string
modProcName=mc_MODNAME & "." & cnsPROCNAME
on Error Goto ERR_SECTION
dim hogehoge as hogehogeClass
set hogehoge = new hogehogeClass
call hogehoge.Init
ERR_SECTION:
'ログ出力
'メール通知処理呼び出したり
'ここにメール送信処理呼び出しメソッド(割愛します)
'エラーメッセージ表示したり
Msgbox(Err.Description)
end sub
クラスモジュール
public sub Init(av_filePath as string)
const cnsPROCNAME="Yobidasimoto"
dim modProcName as string
modProcName=mc_MODNAME & "." & cnsPROCNAME
on Error Goto ERR_SECTION
'なにかの処理
'なにかの処理
'なにかの処理
'なにかの処理
'なにかの処理
'なにかの処理
ERR_SECTION:
if Err.Number<>0 then
call Err.Raise(Err.Number , Err.Souce & ">" & modProcName , Err.Description)
end if
end sub
ログ出力に関しては、なにが一番良いものか決めきれていないところもあるのですが
- グローバル変数使いたくない
- 依存性を極力排除したい
ので、、
クラスの中からログ出力イベント発生させて、呼び出し元でイベントキャッチしてログ出力するようにしてたりします。
また別の記事で書いてみます。
(これがいいのかわからない、、)