Home > Artikel > Ausgabe 8/2011 > Fehlerbehandlung in der Praxis

Fehlerbehandlung in der Praxis

Achtung: Sie sind nicht angemeldet. Wenn Sie Abonnent sind und sich anmelden, lesen Sie den kompletten Artikel, laden das PDF herunter oder probieren die Beispieldatenbank aus (sofern vorhanden).

Wer die technischen Grundlagen zur Fehlerbehandlung im Artikel Fehlerbehandlung unter VBA gelesen hat, braucht nun ein paar Praxisbeispiele. Kein Problem: Der vorliegende Artikel ergänzt noch ein paar Kleinigkeiten und zeigt dann, wie Sie die Befehle zur Fehlerbehandlung sinnvoll in Ihre eigenen Anwendungen integrieren. Dabei erfahren Sie, dass eine Fehlerbehandlung nicht nur unvorhergesehene Fehler abfangen, sondern auch ganz gezielt eingesetzt werden kann.

Beispieldatenbank

Die Beispiele dieses Artikels finden Sie in der Beispieldatenbank 11_08_FehlerbehandlungVBAII.mdb.

Fehler als Option

Einer der wichtigsten Anwendungsfälle neben dem gesteuerten Behandeln von Laufzeitfehlern ist das Provozieren von Fehlern. Gut, eigentlich soll kein Fehler provoziert werden, aber das Auftreten eines Fehlers bei einer bestimmten Aktion kann hier als Option behandelt werden.

Stellen Sie sich vor, Sie hätten eine kleine Prozedur, die einen Eintrag in eine Lookup-Tabelle vornehmen soll – zum Beispiel den Namen einer Kategorie in der Tabelle tblKategorien. Das Feld Kategoriename ist dabei durch den Wert Ja (Ohne Duplikate) für die Eigenschaft Indiziert als eindeutiges Feld markiert (siehe Bild 1). Das wiederholte Anlegen des gleichen Wertes schon in der Datenblattansicht der Tabelle führt dabei zu einer Fehlermeldung. Das Gleiche geschieht, wenn Sie einen Wert wie mit der folgenden VBA-Prozedur einfügen:

Das Hinzufügen doppelter Werte in dieses Feld löst einen Fehler aus.

Bild 1: Das Hinzufügen doppelter Werte in dieses Feld löst einen Fehler aus.

Public Sub KategorieHinzufuegen(strKategorie As String)

     Dim db As DAO.Database

     Set db = CurrentDb

     db.Execute "INSERT INTO tblKategorien(Kategoriename) VALUES('" & strKategorie & "')", dbFailOnError

     Set db = Nothing

End Sub

Es erscheint die Fehlermeldung aus Bild 2.

Fehlermeldung beim Anlegen doppelter Werte im eindeutigen Feld

Bild 2: Fehlermeldung beim Anlegen doppelter Werte im eindeutigen Feld

Wie können Sie diesen Fehler umgehen? Dazu gibt es zwei Varianten. Die erste prüft zuvor, ob es bereits eine Kategorie mit dem angegebenen Namen gibt:

If IsNull(DLookup("KategorieID", "tblKategorien", "Kategoriename = '" & strKategorie & "'")) Then

     db.Execute "INSERT INTO tblKategorien(Kategoriename) VALUES('" & strKategorie & "')", dbFailOnError

Else

     MsgBox "Die Kategorie '" & strKategorie & "' ist bereits vorhanden."

End If

Die zweite Variante fragt gar nicht groß nach, sondern legt den Datensatz einfach an. Da vorher mit On Error Resume Next die eingebaute Fehlerbehandlung deaktiviert wird, löst die Execute-Methode keinen Fehler aus, wenn der anzulegende Datensatz bereits vorhanden ist. Dafür wird aber nachher geprüft, ob nicht vielleicht doch ein Fehler aufgetreten ist – beispielsweise der mit der Nummer 3022. In diesem Fall zeigt die in der If...Then-Bedingung enthaltene Anweisung eine entsprechende Meldung an:

On Error Resume Next

db.Execute "INSERT INTO tblKategorien(Kategoriename) VALUES('" & strKategorie & "')", dbFailOnError

If Err.Number = 3022 Then

     MsgBox "Die Kategorie '" & strKategorie & "' ist bereits vorhanden."

End If

Wirkungsbereich einer Fehlerbehandlung

Eine Fehlerbehandlung aktivieren Sie durch die On Error...-Anweisung aktiviert und sie und endet spätestens mit dem Ende der Prozedur. Sie müssen allerdings zwei Besonderheiten beachten:

  • Sie können die Fehlerbehandlung auch vor dem Prozedurende mit der Anweisung On Error Goto 0 deaktivieren.
  • Wenn die Prozedur eine weitere Prozedur oder Funktion aufruft, während die Fehlerbehandlung aktiviert ist, gilt die Fehlerbehandlung auch hier als aktiviert. Das Gleiche gilt auch für weitere Verschachtelungen.

Wenn Sie also in einer Prozedur wie folgt eine Fehlerbehandlung aktivieren, von dort eine weitere Prozedur aufrufen, in der dann schließlich ein Fehler auftritt, wird der Fehler von der Fehlerbehandlung der aufrufenden Prozedur behandelt. Die aufrufende Prozedur mit der Fehlerbehandlung sieht so aus:

Public Sub VerschachtelteFehlerbehandlung()

     On Error GoTo Fehler

     Call WeitereProzedur

Ende:

     Exit Sub

Fehler:

     MsgBox "Fehler " & Err.Number & ", '" & Err.Description & "'"

     GoTo Ende

End Sub

Dies ist die aufgerufene Prozedur:

Public Sub WeitereProzedur()

     Debug.Print 1 / 0

End Sub

Auch wenn der Fehler erst in der Prozedur Weitere­Prozedur ausgelöst wird, wird er dennoch in der aufrufenden Prozedur verarbeitet.

Wenn Sie jedoch in der aufgerufenen Prozedur gleich zu Beginn die Anweisung On Error Goto 0 einfügen, deaktiviert dies die Fehlerbehandlung nicht! Um dies zu testen, haben wir an verschiedenen Stellen Debug.Print-Anweisungen zur Ausgabe von Zahlen in der Reihenfolge des erwarteten Ablaufs hinzugefügt. Bei folgendem Beispiel werden 1 und 2 ausgegeben, dann erscheint die Fehlermeldung der Fehlerbehandlung:

Public Sub VerschachtelteFehlerbehandlung()

     On Error GoTo Fehler

     Debug.Print 1

     Call WeitereProzedur

     Debug.Print 4

     Debug.Print 1 / 0

     Debug.Print 5

Ende:

     Exit Sub

Fehler:

     MsgBox "Fehler " & Err.Number & ", '" & Err.Description & "'"

     GoTo Ende

End Sub

Public Sub WeitereProzedur()

     On Error GoTo 0

     Debug.Print 2

     Debug.Print 1 / 0

     Debug.Print 3

End Sub

Das heißt, dass eine durch die aufrufende Prozedur aktivierte Fehlerbehandlung in einer Unterprozedur nicht deaktiviert wird. Wenn Sie hingegen die Zeile On Error Goto 0 in der aufrufenden Prozedur unmittelbar vor der Zeile Call WeitereProzedur einfügen, wird die Fehlerbehandlung deaktiviert und die eingebaute Fehlermeldung in Zusammenhang mit der Zeile Debug.Print 1/0 der aufgerufenen Prozedur angezeigt (siehe Bild 3).

Sie haben das Ende des frei verfügbaren Teil dieses Artikels erreicht!

Wenn Sie mehr lesen und auf viele weitere Artikel zugreifen möchten, melden Sie sich als Abonnent unter Login an. Falls nicht, bestellen Sie doch einfach ein Jahresabonnement!