Access Anfänger: Fehlerbehandlung

Aus DBWiki
Wechseln zu: Navigation, Suche

Beim Programmieren gibt es folgende Fehler:

  • Syntaxfehler (lästig, aber ungefährlich)
  • Laufzeitfehler (unser Thema)
  • logische Fehler (meist, wenn man mit den Fingern "denkt")

Alle zur Laufzeit auftretenden Fehler (z.B. Division durch Null) führen zum Abbruch des VBA-Programmes. Der Anwender wird mit einer mehr oder weniger sinnvollen Systemmeldung konfrontiert. Zusätzlich soll er entscheiden, ob er beenden soll oder in den Testmodus wechseln möchte! Man muss als Programmierer also dafür sorgen, daß das Programm seine Fehler selbst behandelt - und zwar in jeder einzelnen Prozedur/Funktion.

Folgende Anweisungen sind oft sinnvoll:

  • On Error Resume Next (Ein Fehler wird ignoriert, VBA geht zur nächsten Zeile.)
  • On Error GoTo 0 (Die Fehlerbehandlung wird wieder an VBA übergeben.)
  • On Error GoTo fehler_marke (Bei Fehler wird zur angegebenen Marke verzweigt.)

Nachdem der Fehler bearbeitet wurde, muss das Fehlerobjekt zurückgesetzt werden:

  • Resume Next (Weiterarbeit in der Zeile, welche nach der Fehler-Zeile liegt.)
  • Resume weiter_marke (Weiterarbeit an der angegebenen Marke.)

In einer Prozedur können mehrere On Error-Anweisungen stehen. Jede dieser Anweisungen ersetzt eine evtl. davor stehende. Die Frage ist natürlich, ob es zweckmäßig ist, mit solchen großen Prozeduren zu arbeiten.

Eine Fehlerbehandlungsroutine muß in der gleichen Prozedur (zumindest) beginnen. Während der Fehlerbehandlung sollte kein weiterer Fehler auftreten. Bei Auftreten eines Fehlers wird das Err-Objekt gesetzt. (In alten Versionen gab es die Systemvariablen Err und Error.) Durch das notwendige Resume am Ende einer Fehlerbehandlung, wird das Err-Objekt wieder zurückgesetzt.

Wichtige Eigenschaften des Err-Objektes:

  • Err.Number (Fehlernummer)
  • Err.Description (Fehlertext)

Kommt es zu einem Laufzeitfehler in einer Prozedur ohne eigene Fehlerbehandlung, wird erst überprüft, ob diese Prozedur von einer anderen aufgerufen wurde. Wenn ja, verwendet VBA deren Fehlerbehandlung und arbeitet dann dort weiter!

Sub FehlerTest()
 
On Error GoTo Fehler1
' hier stehen die Anweisungen,
' deren Fehler man abfangen will
Ende:
   On Error Resume Next    ' sonst provozieren Fehler in der Endebehandlung
                           ' eine Totschleife
   ' hier stehen falls nötig allg. Endemaßnahmen,
   ' z.B. Schließen von Formularen usw.
Exit Sub
 
Fehler1:
   ' hier wird der Fehler ausgewertet
   ' und behandelt
   Resume Ende
End Sub