読者です 読者をやめる 読者になる 読者になる

小さなクラスを作る(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にしているので、エラーが出たら煽られる

まあ、こうなるはず。

f:id:akashi_keirin:20170320084523j:plain

無事にエラー内容が表示され、

f:id:akashi_keirin:20170320084530j:plain

煽られたwww

おわりに

正直、こんなの必要なのかなあ、とは思う。

@akashi_keirin on Twitter