Fehlerbehandlung in der Praxis

Die Fehlerbehandlung ist, wenn man sie konsequent betreibt, erstens eine Menge Schreibarbeit und zweitens, wenn man die Fehlerbehandlung halbautomatisch hinzufügt, eine Fehlerquelle. Mit dem Einsatz von vbWatchdog sieht das anders aus. Dieser Beitrag zeigt, wie sich diese Methode der Fehlerbehandlung im Praxiseinsatz bewährt.

Das Tool vbWatchdog haben wir bereits im Beitrag Fehlerbehandlung mit vbWatchdog (www.access-im-unternehmen.de/779) vorgestellt. Im vorliegenden Beitrag schauen wir uns ein Beispiel einer in einer Anwendung eingesetzten Fehlerbehandlung an, die zwei verschiedene Modi zulässt – einen für den Produktiveinsatz und einen für die Entwicklung.

vbWatchdog können Sie unter folgendem Link herunterladen:

http://www.everythingaccess.com/vbwatchdog.htm

Dort gibt es auch eine kostenlose Testversion.

Nach der Installation finden Sie im VBA-Editor einen Menü-Eintrag namens Add-Ins|vbWatchdog|Add vbWatchdog to this project, mit dem Sie schlicht und einfach ein paar Klassen zum aktuellen VBA-Projekt hinzufügen. Schließlich müssen Sie die Fehlerbehandlung noch aktivieren, wobei Sie gegebenenfalls sogar verschiedene Fehlerbehandlungen verwenden können.

Im Beispiel dieses Beitrags, der Datenbank aus dem Beitrag Kunden, Verträge und Anschreiben verwalten (www.access-im-unternehmen.de/854), kommen gleich zwei verschiedene Fehlerbehandlungen zum Einsatz.

Die erste ist für den Produktiveinsatz gedacht und liefert im Falle eines Fehlers eine Fehlermeldung, die den Benutzer nicht mit unnötigen und nichtssagenden Informationen belastet, sondern diesem schlicht und einfach die Möglichkeit bietet, die Fehlerinformationen zum Entwickler der Anwendung zu senden. Diese Fehlermeldung sieht beispielsweise wie in Bild 1 aus.

pic001.png

Bild 1: Für den Benutzer gedachte Fehlermeldung

Ein Klick auf die Schaltfläche Mit Outlook per E-Mail senden führt dann zum Öffnen einer E-Mail mit einigen Informationen, die dem Entwickler beim Beheben des Fehlers behilflich sein könnten (s. Bild 2).

pic002.png

Bild 2: Fehlermeldung per E-Mail

Der Benutzer kann den Inhalt der Fehlermeldung auch noch in die Zwischenablage kopieren und diese dann selbstständig an den Entwickler versenden – gegebenenfalls existiert auf der Zielmaschine ja gar kein Outlook.

Die zweite Variante der Fehlerbehandlung ist auf die Phase der Entwicklung der Anwendung ausgelegt. Sie soll nur für den Entwickler sichtbar sein und erlaubt auch das Debuggen des Fehlers.

Die in der Beispieldatenbank verwendete Fehlerbehandlung für den Entwicklermodus liefert Fehlermeldungen wie die aus Bild 3.

pic003.png

Bild 3: Entwickler-geeignete Fehlermeldung …

Ein Klick auf die Schaltfläche Variablen anzeigen liefert auch noch alle Variablen zum Zeitpunkt des Fehlers (s. Bild 4).

pic004.png

Bild 4: … mit Auflistung der Variablen zum Fehlerzeitpunkt

Wenn Sie diese Fehlermeldungen einfach übernehmen möchten, gelingt dies recht einfach. Tragen Sie zunächst einen Aufruf wie den folgenden in einer Prozedur ein, die beim Start der Anwendung aufgerufen wird – beispielsweise in die Beim Laden-Ereignisprozedur eines Startformulars:

Private Sub Form_Load()
    ErrEx_Starten
    End Sub

Die dadurch aufgerufene Prozedur finden Sie im Modul mdlError, das Sie der Zielanwendung hinzufügen müssen:

Public Sub ErrEx_Starten()
If VBA.Command() = "Developer" Then
 Errordialog_Entwickler
Else
 Errordialog_Benutzer
End If
End Sub

Die Prozedur prüft, ob die Funktion Command den Wert Developer zurückliefert. Hier gibt es eine Querverbindung zum Beitrag Datenbanken im Produktiv- und Entwicklermodus (www.access-im-unternehmen.de/855).

Dieser Beitrag beschreibt eine Starter-Datenbank, mit der Sie festlegen können, mit welchen Eigenschaften eine Datenbank gestartet wird.

Dort geben Sie einem Aufruf der Zieldatenbank unter anderem einen Parameter namens cmd mit, der beispielsweise den Wert Developer enthält. Sollten Sie die Zieldatenbank also mit einer Verknüpfung öffnen, die den Parameter /cmd "Developer" enthält, würde die Funktion Command den Wert Developer liefern, was wiederum dazu führt, dass die Prozedur Errordialog_Entwickler aufgerufen wird. In allen anderen Fällen wird die Prozedur Errordialog_Benutzer zum Einrichten der Fehlerbehandlung für diese Instanz der Anwendung aufgerufen.

Die beiden Prozeduren Errordialog_Entwickler und Errordialog_Benutzer sorgen also für die Einrichtung der Fehlerbehandlung. Schauen wir uns in den folgenden Abschnitten an, wie dies im Detail aussieht.

Entwickler-Fehlermeldung

Die Fehlermeldung, die der Entwickler zu sehen bekommen soll, wird durch die Prozedur Errordialog_Entwickler definiert (s. Listing 1). Diese Prozedur aktiviert auch die Fehlerbehandlung durch vbWatchdog. Die erste Anweisung beendet eine eventuell laufende Fehlerbehandlung und startet diese neu. Dass die Methode Err.Enable nur eine leere Zeichenkette als Parameter erhält, liegt daran, dass beim Auftreten eines Fehlers keine weiteren Aktionen mit Ausnahme der Anzeige der Fehlermeldung erfolgen sollen.

Listing 1: Einrichten und Aktivieren des Entwickler-Fehlerdialogs

Public Sub Errordialog_Entwickler()
    ErrEx.Disable
    ErrEx.Enable ""
    With ErrEx.DialogOptions
        .HTML_MainBody = "<font face=Arial size=13pt color=""#4040FF""><b>" _
            & "Es ist ein Laufzeitfehler aufgetreten.</b></font><br><br><b><ERRDESC></b><br><br>" _
            & "Projekt:|<SOURCEPROJ><br>Modul:|<SOURCEMOD><br>Prozedur:|<SOURCEPROC><br>" _
            & "Fehlernummer:|<ERRNUMBER><br>Fehlermeldung:|<ERRDESC><br>Zeile:|<SOURCELINENUMBER>" _
            & "<br>Zeileninhalt:|<SOURCELINECODE><br>Datum und Zeit:|<ERRDATETIME><br><br><b><u>" _
            & "Was möchten Sie tun</u></b>"
        .HTML_CallStackItem = "<b><font color=#303030><SOURCEPROJ>.<SOURCEMOD>.<SOURCEPROC>" _
            & "</font></b><br> |<font bgcolor=#F8F8F8>Zeile <SOURCELINENUMBER>: <i>" _
            & "<SOURCELINECODE></i></font><br>"
        .HTML_MoreInfoBody = "<br><b><font face=Arial size=13pt color=#FFFFFF bgcolor=#C0C0C0>" _
            & " Aufrufeliste </font></b><br><br><CALLSTACK>"
        .RemoveAllButtons
        .AddButton "Variablen anzeigen", BUTTONACTION_SHOWVARIABLES
        .AddButton "Quellcode debuggen", BUTTONACTION_ONERRORDEBUG
        .AddButton "Ignorieren und fortsetzen", BUTTONACTION_ONERRORRESUMENEXT
        .AddButton "Beenden", BUTTONACTION_ONERROREND
        .AddButton "Hilfe", BUTTONACTION_SHOWHELP
        .MoreInfoCaption = "Details einblenden"
        .LessInfoCaption = "Details ausblenden"
        .ShowMoreInfoButton = True
        .WindowCaption = "Fehler im Projekt ''<SOURCEPROJ>''"
    End With
    With ErrEx.VariablesDialogOptions
        .WindowCaption = "Variablenliste"
        .HTML_CallStackItem = "<b><SOURCEPROJ>.<SOURCEMOD>.<SOURCEPROC></b><br><br><VARIABLES><br>"
        .HTML_MainBody = "<CALLSTACK>"
        .HTML_MoreInfoBody = ""
        .HTML_VariableItem = "<font color=#808080>(<VARSCOPE>)</font>|" _
            & "<VARNAME> As <VARTYPE>| = <VARVALUE><br>"
        .RemoveAllButtons
        .AddButton "Schließen", BUTTONACTION_VARIABLES_CLOSE
    End With
End Sub

Diese enthält bereits alle notwendigen Informationen, sodass diese nicht etwa in der Zwischenablage oder in einer Tabelle zur weiteren Verarbeitung gespeichert werden müssen. Die folgenden Anweisungen definieren genau, wie die Fehlermeldungen aussehen sollen. Als Erstes legt die Prozedur dabei fest, wie der Hauptfehlerdialog aussehen soll. Das dafür verwendete Objekt heißt DialogOptions. Es enthält beispielsweise eine Eigenschaft namens HTML_MainBody. Damit legen Sie fest, wie die Meldung aussehen soll. Dabei werden einige Platzhalter wie etwa <ERRDESC>, <SOURCEPROJ>, <SOURCEMOD>, <SOURCEPROJ>, <ERRNUMBER>, <ERRDESC>, <SOURCELINENUMBER>, <SOURCELINECODE> und <ERRDATETIME> verwendet – deren Funktion erklärt sich eigentlich von selbst.

Die Eigenschaft HTML_CallStackItem nimmt die Aufrufe der Prozeduren bis zum Fehler und HTML_MoreInfoBody die Überschrift für den erweiterten Bereich entgegen. Schauen wir uns an, wo diese Daten für einen einfachen Fehler wie den aus dem folgendem Beispiel landen:

Public Sub Fehlerbeispiel()
    Dim i As Integer
    For i = 3 To 0 Step -1
         Debug.Print 1 / i
    Next i
End Sub

Bild 5 zeigt einige der Bereiche, die per HTML definiert wurden. Wenn Sie auf Details einblenden klicken, wird auch noch der mit der Eigenschaft HTML_MoreInfoBody festgelegte Bereich sichtbar – der wiederum mit <Callstack> den für die Eigenschaft HTML_CallStackItem definierten Bereich einbindet.

pic005.png

Bild 5: Verschiedene Bereiche der Fehlermeldung

Die RemoveAllButtons-Methode entfernt alle eingebauten Schaltflächen, die folgenden Methoden fügen die gewünschten Schaltflächen hinzu. Dabei erwartet der erste Parameter jeweils die Beschriftung, der zweite fügt eine Konstante für eine der eingebauten Funktionen hinzu.

So erhält die Schaltfläche, welche die Liste der aktuell verwendeten Variablen und ihrer Werte anzeigen soll, die Beschriftung Variablen anzeigen als ersten Parameter und die Konstante BUTTONACTION_SHOWVARIABLES als zweiten Parameter.

Die Schaltfläche zum Anzeigen weiterer Informationen passen Sie auf eine andere Art an, nämlich indem Sie diese mit der Eigenschaft ShowMoreInfoButton einblenden und die Beschriftung mit der Eigenschaft MoreInfoCaption anpassen. Gleiches gilt für die Schaltfläche, welche die Details wieder ausblendet.

Den mit der Details einblenden-Schaltfläche angezeigten Bereich definieren Sie, wie bereits erwähnt, mit der Eigenschaft HTML_MoreInfoBody.

Fehlt noch der Bereich, der beim Klick auf die Schaltfläche Variablen anzeigen geöffnet wird (s. Bild 6). Diesen stellen Sie mit den Eigenschaften des Objekts VariablesDialogOptions ein.

pic006.png

Ende des frei verfügbaren Teil. Wenn Du mehr lesen möchtest, hole Dir ...

den kompletten Artikel im PDF-Format mit Beispieldatenbank

diesen und alle anderen Artikel mit dem Jahresabo

Schreibe einen Kommentar