|
Es gibt verschiedene Ereignisse, in denen zuvor eingeschaltete Fehlerbehandlungen nicht anspringen. So etwa reagiert eine vor dem Anzeigen eines Forms eingeschaltete Fehlerbehandlung nicht:
Public Sub Main()
On Error GoTo MainError
Form1.Show
Exit Sub
MainError:
Debug.Print Err.Description
End Sub
Der Fehler wäre beispielsweise im Load-Ereignis des Forms aufgetreten:
Private Sub Form_Load()
Dim n As Double
n = 1 / 0
End Sub
Zu erwarten wäre eigentlich, dass die Fehlerbehandlung in der oben stehenden Sub Main anspringt und die Fehlerbeschreibung "Division durch Null" im Direktfenster ausgegeben werden würde. Doch statt wird die Ausführung stur an der Fehlerstelle mit einer Fehlermeldung angehalten - die zuvor in Sub Main eingeschaltete Fehlerbehandlung wird ignoriert. Von dieser Ignoranz sind auch die Initialize-Ereignisse von Forms als auch von UserControls usw. betroffen.
Es gibt wohl keinen anderen Ausweg, als in diesen Ereignissen eine eigene Fehlerbehandlung einzuschalten, im Falle eines Fehlers die Fehlerdaten zwischenzuspeichern und diese im Anschluss an den übergeordneten Aufruf auszulesen. Zur Zwischenspeicherung dient die folgende einfache Klasse ErrClass. Mit einem Aufruf ihrer Init-Methode liest sie selbsttätig die aktuellen Werte des VB-Err-Objekts aus und speichert sie in privaten Variablen. Die Werte können über Nur-Lese-Eigenschaften abgefragt werden.
Private pNumber As Long
Private pSource As String
Private pDescription As String
Private pHelpFile As String
Private pHelpContext As Long
Public Property Get Number() As Long
Number = pNumber
End Property
Public Property Get Source() As String
Source = pSource
End Property
Public Property Get Description() As String
Description = pDescription
End Property
Public Property Get HelpFile() As String
HelpFile = pHelpFile
End Property
Public Property Get HelpContext() As Long
HelpContext = pHelpContext
End Property
Public Sub Init()
With Err
pNumber = .Number
pSource = .Source
pDescription = .Description
pHelpFile = .HelpFile
pHelpContext = .HelpContext
End With
End Sub
Eine Fehlerüberwachung eines Form_Load-Ereignisses könnte damit so ausgestattet werden - im Form:
Private mErrLoad As ErrClass
Public Property Get ErrLoad() As ErrClass
If mErrLoad Is Nothing Then
Set ErrLoad = New ErrClass
Else
Set ErrLoad = mErrLoad
End If
End Property
Private Sub Form_Load()
Dim x As Double
On Error GoTo LoadErr
x = 1 / 0
Exit Sub
LoadErr:
Set mErrLoad = New ErrClass
mErrLoad.Init
End Sub
Und beispielsweise eine Sub Main-Prozedur, in der das Form zur Anzeige gebracht werden soll:
Public Sub Main()
With frmTest
.Show
With .ErrLoad
If .Number Then
MsgBox .Description, vbCritical, "Fehler in 'frmTest.Show'"
End If
End With
End With
End Sub
|