小さなクラスを作る(5)~エラーキャッチをするクラス
エラーキャッチをするクラスを作る
そんなことをする意味があるのかどうかはともかく、エラー時にメッセージを表示させるという処理もよく使うので、作ってみた。まあ、何でもかんでもクラスを作っていったら、そのうちコツがつかめるだろうということで勘弁してくださいw
例によって、クラスモジュールを挿入して、名前は「ErrorCatcher」にした。
クラス「ErrorCatcher」のコード
フィールド部分
Option Explicit 'フィールド Private processName_ As String Private errorNumber_ As Integer Private errorDescription_ As String Private isNecessaryToProvoke_ As Boolean
アクセサ部分
'アクセサ Public Property Get processName() As String processName = processName_ End Property Public Property Get errorNumber() As Integer errorNumber = errorNumber_ End Property Public Property Get errorDescription() As String errorDescription = errorDescription_ End Property Public Property Get isNecessaryToProvoke() As Boolean isNecessaryToProvoke = isNecessaryToProvoke_ End Property
コンストラクタ部分
珍しく使いどころがあった。
'コンストラクタ Private Sub Class_Initialize() errorNumber_ = Err.Number errorDescription_ = Err.Description End Sub
このクラスのインスタンスが生成された時点でErrオブジェクトが持っているNumberとDescriptionをセットするようにした。ただ、このやり方だと、次のような問題が生ずる。すなわち、
- エラーキャッチしようとするたびにインスタンス化し、終わったらすぐに破棄しないといけない
- エラーが発生する場所に「On Error GoTo 0」を書いてはいけない
う~ん、こんなに約束事が多いんじゃ、使えないかなあ。
メソッド部分
'メソッド Public Sub showError(ByVal errorPlace As String, _ Optional ByVal toProvoke As Boolean = False) '……(1)' processName_ = errorPlace MsgBox errorPlace & "で、" & vbCrLf & _ "エラー番号:" & errorNumber_ & _ "、「 " & errorDescription & "」エラーが発生しています。" & _ vbCrLf & _ "原因を確認して対応してください。", vbInformation '……(2)' If toProvoke = True Then '……(3)' MsgBox " _________" & vbCrLf & _ " / \ " & vbCrLf & _ "/ /・\ /・\ \" & vbCrLf & _ "|  ̄ ̄  ̄ | ち~んw" & vbCrLf & _ "| (_人_) |" & vbCrLf & _ "| \ | |" & vbCrLf & _ "\ \_| /", vbCritical End If Err.Clear '……(4)' End Sub
コードの説明
- (1)。引数は2つ指定。第1引数はエラーが発生した場所を表す文字列。第2引数は、「煽り」を入れるかどうか。完全に遊びですw
- (2)は、通常のエラー発生お知らせメッセージ。
- (3)。第2引数でTrueが渡されていたら、ユーザを煽るw
- (4)でErrオブジェクトをクリア。
実行
標準モジュールに、
Sub test() Set fc = New FolderCreator fc.createFolder ThisWorkbook.path, "spaghetti?" '……(1)' If fc.hasError = True Then '……(2)' Set ec = New ErrorCatcher '……(3)' ec.showError "FolderCreatorクラスのcreateFolderメソッド", True '……(4)' Set ec = Nothing '……(5)' End If Set fc = Nothing End Sub
こんなコードを書いて実行してみた。
- (1)で、不正な文字を使ったフォルダ名を指定
- そうすると、FolderCreatorクラスのcreateFolderメソッドでエラーが出るはず
- エラーが出たら、FolderCreatorクラスのインスタンスfcのhasErrorプロパティはTrueになる
- そうなると、(2)の条件式がTrueになるので、
- (3)でErrorCatchクラスのインスタンスecを生成して、
- (4)でshowErrorメソッドを呼び出す
- 第2引数をTrueにしているので、エラーが出たら煽られる
まあ、こうなるはず。
無事にエラー内容が表示され、
煽られたwww
おわりに
正直、こんなの必要なのかなあ、とは思う。