例外とエラーへのアプローチ全体を変更します。
- 新しいアセンブリ (プロジェクト) を作成し、アプリケーションで参照します
- 個人データ型 (参照アセンブリ) を受け入れる新しい共有イベントを宣言します。
- 新しいイベントで RaiseEvent を実行する少なくとも 1 つの共有関数 (参照アセンブリ) を宣言します。
- それに応じて反応する共有イベントのハンドラー (メイン アプリケーション) を追加します。
- エラー/例外をスローする必要があるときはいつでも独自のパラメーターを渡して、メイン アプリケーション内から関数を呼び出します。
このようにして、多くのプログラミング ミスを回避し、エラーと例外処理を一元化します。
Public Module IDENTIFIERS
Public Enum EvtMsg
ERR_MYERR
ERR_MYERR2
End Enum
Public Enum EvtClass
EXCEPTION
ERR
End Enum
End Module
Public Class Events
Shared Event Err(ByVal code As EvtMsg)
Shared Event Exception(ByRef iEx As Exception)
Public Shared Sub Raise(ByVal iEvtClass As EvtClass, ByVal iMsg As EvtMsg, Optional ByRef iEx As Exception = Nothing)
If Not [Enum].IsDefined(GetType(EvtClass), iEvtClass) Then
Dim ex As New ArgumentOutOfRangeException("unbekannte Event-Klasse '" & iEvtClass.ToString & "' übergeben", "iEvtClass")
RaiseEvent Exception(ex)
End If
If Not [Enum].IsDefined(GetType(EvtMsg), iMsg) Then
Dim ex As New ArgumentOutOfRangeException("unbekannte Event-Msg '" & iMsg.ToString & "' übergeben", "iMsg")
RaiseEvent Exception(ex)
End If
Select Case iEvtClass
Case EvtClass.ERR
RaiseEvent Err(iMsg)
Case EvtClass.EXCEPTION
If iEx IsNot Nothing Then
RaiseEvent Exception(iEx)
Else
Dim ex As New MissingFieldException("Raise() ohne Exception aufgerufen, iMsg : " & iMsg & "EvtClass : " & iEvtClass.ToString(), "iEx")
RaiseEvent Exception(ex)
End If
End Select
End Sub
End Class
これで、エラー アセンブリを参照する任意のアセンブリでこれらのエラー ハンドラーを簡単に使用できるようになりました。
コンストラクタ
AddHandler Events.Err, AddressOf Err
AddHandler Events.Exception, AddressOf Except
クラス体
Private Sub Except(ByRef iEx As Exception)
'do your stuff here
End Sub
Private Sub Err(ByVal Err As EvtMsg)
'do your stuff here
End Sub