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 Abb. 1 aus.

pic001.png

Abb. 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. Abb. 2).

pic002.png

Abb. 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 Abb. 3.

pic003.png

Abb. 3: Entwickler-geeignete Fehlermeldung …

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

pic004.png

Abb. 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

Abb. 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

Abb. 5: Verschiedene Bereiche der Fehlermeldung

Sie haben das Ende des frei verfügbaren Textes erreicht. Möchten Sie ...

Workplace

Jahresabonnement TestzugangOder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:

Schreibe einen Kommentar