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