Error-Objekt - Gültigkeitsbereich

Gültigkeitsbereich von Error-Handlern

Ein Error-Handler wird beim Verlassen einer Sub-Routine, einer Function oder einer Property deaktiviert. Die On Error Anweisung ist beim Rücksprung in die aufrufende Prozedur nicht länger gültig.

Sub FirstSub()
    Dim i As Integer
    SecondSub
    i = 8 / 0 'hier kommt es zum behandelten Fehler!
End Sub
 
Sub SecondSub()
    Dim i As Integer
    On Error Resume Next
    i = 8 / 0 'dieser Fehler wird unterdrückt
End Sub

In nachfolgendem Beispiel wird trotz Fehlerunterdrückung die Fehlernachricht angezeigt:

Sub FirstSub()
    Dim i As Integer
    On Error Resume Next
    SecondSub
    i = 8 / 4
    If Err.Number <> 0 Then MsgBox "Fehler!"
End Sub
 
Sub SecondSub()
    Dim i As Integer
    On Error Resume Next
    i = 8 / 0
End Sub

Grund für diese Fehlermeldung ist ein nicht initialisiertes Error-Objekt beim Verlassen der Routine SecondSub. Dort wird zwar der Fehler 11 unterdrückt, aber der Fehler bleibt solange im Fehlerobjekt erhalten, bis das Objekt durch Err.Clear (oder eine entsprechenden Resume-Anweisung) initialisiert wird.

Die Anweisung i = 8 / 4 in der Routine FirstSub führt zwar nicht zu einem Fehler, aber das Error-Objekt besitzt noch die Fehlerinformationen aus der zuvor aufgerufenen SecondSub, so dass Err.Number immer noch den Wert 11 besitzt und es somit zur Anzeige der Fehlermeldung kommt!

Die korrekte Implementierung der Error-Handler sieht wie folgt aus:

Sub FirstSub()
 
    Dim i As Integer
    Dim lngError As Long
 
    SecondSub
 
    On Error Resume Next
    i = 8 / 4
    lngError = Err.Number
    On Error GoTo 0
    If lngError <> 0 Then MsgBox "Fehler!"
 
End Sub
 
Sub SecondSub()
 
    Dim i As Integer
    On Error Resume Next
    i = 8 / 0
    On Error GoTo 0
 
End Sub