Fehler protokollieren

12. Januar 2014

Eine professionell entwickelte Datenbank-Anwendung verfügt selbstverständlich über eine Fehlerbehandlung: Jegliche Laufzeitfehler - also Fehler, welche während der Benutzung der Datenbank auftreten - werden abgefangen, der Benutzer erhält eine aussagekräftige Fehlermeldung und die Anwendung wird entweder fortgeführt oder kontrolliert beendet.

Langfristiges Ziel ist es natürlich, sämtliche Fehler zu beheben. Dazu muss der Entwickler wissen, wann welche Fehler aufgetreten sind. Ein Benutzer wird den Entwickler aber nur dann benachrichtigen, wenn ein Fehler ihn darin hindert, eine Funktion überhaupt zu benutzen - ansonsten wird die Fehlermeldung schlicht ignoriert.

In unseren Datenbank-Anwendungen werden Fehler deshalb in einem Fehlerprotokoll abgelegt. Diese Protokolle schauen wir uns von Zeit zu Zeit an: Nach der Installation eines neuen Moduls alle paar Stunden oder Tage, ansonsten etwa alle sechs Monate. So können wir etwaige Fehler schnell erkennen und aufgrund der im Fehlerprotokoll enthaltenen Informationen in der Regel gleich beheben.

Eine professionell entwickelte Datenbank-Anwendung verfügt selbstverständlich über eine Fehlerbehandlung. Das bedeutet, dass jegliche Laufzeitfehler - also Fehler, welche während der Benutzung der Datenbank auftreten - abgefangen werden, der Benutzer eine aussagekräftige Fehlermeldung erhält und die Anwendung entweder korrekt fortgeführt oder kontrolliert beendet wird.

Das Error-Handling in den Funktionen

Die Funktionen sind alle nach folgendem Schema aufgebaut:

Function Toto (Par1, Par2)

Dim Msg As String, Code As String, Status As Integer, Info As Variant

  On Error Goto Err_Toto

  Info = "Par1 = " & Par1 & ", Par2 = " & Par2

  [Code-Block 1]
  Status = 10

  [Code-Block 2]
  Status = 20

  ...

  Exit Function

Err_Toto:
  Msg = "Fehler beim [Beschreibung für Toto]"
  Code = "Toto()"
  Fehlerbehandlung Msg, Code, Status, Info
  Exit Function

End Function

Msg enthält eine möglichst aussagekräftige Meldung für den Benutzer. Die Variable kann natürlich auch schon innerhalb der Funktion gesetzt werden, weil vielleicht im Verlaufe der Funktion jeweils andere Meldungen sinnvoll sind. Dann heißt es im Error Handler unten eben If IsNull(Msg) Then Msg = "...".

Code enthält den Namen der Funktion. Hier kann man natürlich auch gleich die aktuellen Parameter ergänzen.

Über die Variable Status sieht man im Fehlerprotokoll, wo ungefähr der Fehler aufgetreten ist. Zwischen zwei Inkrementierungen von Status liegen in der Regel nur ein paar Zeilen. Und wenn ich einen speziellen Fehler verfolge, füge ich auch schon mal eine Status-Zeile hinter jede einzelne Code-Zeile ein.

Die Variable Info dient dazu, zusätzliche Informationen in das Fehlerprotokoll zu schreiben, etwa den Wert der Funktionsparameter oder sonstige Werte, anhand derer man mehr über den Kontext erfährt, in dem der Fehler aufgetreten ist. In kurzen Funktionen bleibt diese Variable meist leer, weil keine zusätzliche Information erforderlich ist.

Die Fehlerbehandlung

Die Funktion Fehlerbehandlung gibt die Fehlermeldung für den Benutzer aus und trägt einen Datensatz in das Fehlerprotokoll ein. Außerdem setzt sie die Statusanzeige, die Eieruhr und die Err.Number zurück.

Ihre minimale Version sieht folgendermaßen aus:

Function Fehlerbehandlung(Msg As String, Code As String, Status As Integer, Info As Variant)
  
  If Len(Msg) > 0 Then MsgBox Msg, vbExclamation, "Meine DB"
  Protokoll_Enter Msg, Code, Status, Info

  SysCmd acSysCmdClearStatus
  DoCmd.SetWarnings True
  DoCmd.Hourglass False
  Err = 0
  Exit Function

End Function

Diese Funktion kann man nun ganz nach Bedarf erweitern. Zum Beispiel kann man für gewisse Fehler (Err.Number) die Fehlermeldung an den Benutzer noch um zusätzliche Texte ergänzen. In anderen Fällen ist es ausreichend, dem Benutzer eine Meldung auszugeben, aber keinen Eintrag ins Protokoll vorzunehmen.

Tabelle für das Fehlerprotokoll

Wir verwenden für das Fehlerprotokoll eine Tabelle, die etwa folgende Struktur hat:

Fehlerprotokoll für Access-Datenbank

Weitere nützliche Felder sind z.B. die Versions-Nummer oder der Name des aktuellen PCs - das hängt natürlich immer von der jeweiligen Applikation ab.

Der Eintrag ins Fehlerprotokoll

Die Funktion zum Eintrag des Fehlers in das Fehlerprotokoll sieht zum Beispiel folgendermaßen aus:

Function Protokoll_Enter(Msg As String, Code As String, Status As Integer, Info As Variant)

  On Error Resume Next

  TProt.AddNew
  With TProt
    !Name = [Aktueller Benutzer]
    !Datum = Now
    !Code = Code
    !Status = Status
    !Err = Err
    !Msg = Msg
    !Info = Info
  End With
  TProt.Update

  If Err Then
    MsgBox "Fehler beim Eintragen in das Protokoll:" & vbCrLf & Error, vbExclamation, "Meine DB"
    End If
    Err = 0
  End If

  Exit Function

End Function

Das Fehlerprotokoll kann man natürlich auch verwenden, um andere Ereignisse zu protokollieren. Zum Beispiel kann man unter Verwendung des Protokolls ein einfaches Monitoring für neue Funktionen implementieren.

Stichworte

  • Fehlerbehandlung
  • Debugging
  • Error handler
  • Fehleranalyse