【VBA】Errオブジェクトを利用した実行時エラー時の簡単なコールスタック

VBAには、try-catch-finallyにexceptionクラスを使った例外処理・・・

といったことができないので、ちょっと工夫が必要。

exceptionクラスを自分で作成するまでやりたくないけど、ちょっとしたデバッグ用コード

■最低限必要なコード

・コールスタックを取得したいメソッド(プロパティ)には「 On Error GoTo ・・・」で例外時のふるまいを記載

・例外発生時に、Errオブジェクトの内容を書き換え(書き加え)て、呼び元のメソッド

 に戻す (Err.Raise)こととする。

■ソース例

‘呼び元(トップ)
Sub main()

  ‘▼エラー監視の開始
  On Error GoTo ExceptionHandling
 
  ‘~処理~
  ‘ エラー発生で ラベル ExceptionHandling: 以降を実行。
  Call funcA

 

  ‘正常終了時
  Exit Sub

‘例外発生時
ExceptionHandling:
    Dim s As String
    s = Err.Number & vbCr & vbLf _
        & Err.Source & vbCr & vbLf _
        & Err.Description & vbCr & vbLf _
        & Err.HelpContext & vbCr & vbLf _
        & Err.HelpFile & vbCr & vbLf _
        & Err.LastDllError & vbCr & vbLf
       
    ‘▼例外処理の結果
    Debug.Print s

End Sub

Sub funcA()

  ‘▼エラー監視の開始
  On Error GoTo ExceptionHandling
 
  Call funcB
 
 
ExceptionHandling:

‘▼例外処理実行
Err.Source = Err.Source & "->funcA"
Call Err.Raise(Err.Number, Err.Source, Err.Description)

End Sub

Sub funcB()

  ‘▼エラー監視の開始’
  On Error GoTo ExceptionHandling
 
  Call funcC

ExceptionHandling:

  ‘▼例外処理実行
  Err.Source = Err.Source & "->funcB"
  Call Err.Raise(Err.Number, Err.Source, Err.Description)
End Sub

Sub funcC()

  ‘▼エラー監視の開始
  On Error GoTo ExceptionHandling
 
  ‘テスト用に適当な例外を発生
  ”Err.Raise 100
  Dim a As Integer
  a = 100 / 0
 
ExceptionHandling:
  ‘▼例外処理実行
  Err.Source = Err.Source & "->funcC"
  Call Err.Raise(Err.Number, Err.Source, Err.Description, Err.HelpFile, Err.HelpContext)
End Sub

■実行結果の例

011
VBAProject->funcC->funcB->funcA
0 で除算しました。
1000011
C:\PROGRA~1\COMMON~1\MICROS~1\VBA\VBA6\1041\VbLR6.chm
0

※ポイントは2行目

※例外の発生した”fancC”から 、呼び元までコールされたメソッドが

※記載されるようになっている。

コメント

タイトルとURLをコピーしました