Um in einer VB6-Routine (Function, Sub oder Property) mehrere Fehler ordentlich abzufangen muss eine etwas merkwürdige Kombination von “on local error” und “resume” verwendet werden.
Diese Beispiel-Sub geht von einem simplen “Form1″-Formular sowie einem “Command1″-Button aus.
Das Beispiel versucht mehrere Eigenschaften des aktuellen Objektes (”Form1″) abzufragen wobei die Sub verlassen werden soll wenn kein Fehler auftrat.
Die Eigenschaften sind “Error1″ gefolgt von “Error2″ und letztlich “Caption” was die Titel Zeile des Formulars ist.
Geht man diese Sub im Debug Modus Schritt für Schritt durch (F8 drücken) sieht man sehr schön wie “wild” hin und hergesprungen wird. Das ganze ist nicht ganz fein, funktioniert aber.
Private Sub Command1_Click()
Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")
On Local Error GoTo try_2
Debug.Print CallByName(Me, "Error1", VbGet)
Exit Sub
try_2_real:
On Local Error GoTo try_3
Debug.Print CallByName(Me, "Error2", VbGet)
Exit Sub
try_3_real:
On Local Error GoTo real_error
Debug.Print CallByName(Me, "Caption", VbGet)
Exit Sub
try_2:
Debug.Print "try_1: " & Err.Number & " " & Err.Description
Resume try_2_real
try_3:
Debug.Print "try_2: " & Err.Number & " " & Err.Description
Resume try_3_real
real_error:
Debug.Print "real_error: " & Err.Number & " " & Err.Description
Exit Sub
End Sub
Zum Vergleich mal ein nicht funktionierendes Beispiel:
Private Sub Command2_Click()
Debug.Assert ("F8 drücken um die Aufrufe einzeln durchzugehen" = "")
On Local Error GoTo try_2
Debug.Print CallByName(Me, "Error1", VbGet)
Exit Sub
try_2:
On Local Error GoTo 0
On Local Error Resume Next
On Local Error GoTo try_3
Debug.Print CallByName(Me, "Error2", VbGet)
Exit Sub
try_3:
On Local Error GoTo real_error
Debug.Print CallByName(Me, "Caption", VbGet)
Exit Sub
real_error:
Debug.Print "real_error: " & Err.Number & " " & Err.Description
Exit Sub
End Sub
Warum das zweite Beispiel nicht funktioniert bzw. nur das Erste liegt vermutlich daran das man während einer “Fehlerbehandlung” keine andere Fehlerbehandlung aktivieren oder die aktuelle deaktivieren kann. Aufgrund des “Resume try_2_real” im ersten Beispiel wird die Fehlerbehandlung zurück gesetzt um umgehend wieder gesetzt zu werden. Ein Vorteil könnte sein das man gezielt auf Spezielle Fehler reagieren kann.