|  | Unser Angebot für Sie! Lesen Sie diesen Beitrag und 500 andere sofort im Onlinearchiv, und erhalten Sie alle zwei Monate brandheißes Access-Know-how auf 72 gedruckten Seiten! Plus attraktive Präsente, zum Beispiel das bald erscheinende Buch 'Access 2010 - Das Grundlagenbuch für Entwickler'! |
| |
Zusammenfassung
Verwenden Sie vbWatchdog, um Ihre herkömmliche Fehlerbehandlung durch eine globale und moderne Fehlerbehandlung abzulösen.
Techniken
VBA, Fehlerbehandlung
Voraussetzungen
Access 2000 und höher
Beispieldateien
vbWatchdog.mdb
Shortlink
www.access-im-unternehmen.de/779
Fehlerbehandlung mit vbWatchdog
André Minhorst, Duisburg
Fehlerbehandlung ist für viele eine lästige Pflicht. Wenn man es richtig machen will, muss man jede einzelne Routine mit einer Fehlerbehandlung versehen. Dazu kommen noch Zeilennummern, Angabe des Modul- und Prozedurnamens und Informationen wie die Fehlernummer und Beschreibung. Die damit zusammenhängende Schreibarbeit kann man sich auf elegante Weise vom Hals schaffen - und mehr. Erreichen können Sie dies mit vbWatchdog - vier Klassenmodule und ein paar Zeilen Code sorgen für eine professionelle Fehlerbehandlung und wesentlich schlankere Prozeduren.
+++ Frühlingsaktion +++
+++ Access [basics] Jahresabo
+++ plus eBook "Das Access 2003-Entwicklerbuch"
+++ 39,95 Euro statt 79,- Euro inkl. MwSt.!
+++ www.access-basics.de
vbWatchdog gibt es in zwei Versionen: Standard und Enterprise. Die Enterprise-Version enthält einige Features mehr, die den aktuellen Unterschied von 50% Aufschlag zum Preis der Standardversion mehr als rechtfertigen. Normalerweise werden in Access im Unternehmen keine kostenpflichtigen Tools vorgestellt, aber wenn eines soviel Arbeit wie in diesem Fall sparen kann, machen wir eine Ausnahme.
vbWatchdog ist der deutlich verbesserte Nachfolger des SimplyVB6 - Global Error Handlers des gleichen Herstellers. vbWatchdog können Sie in beliebig viele Anwendungen einbauen. Preise für Mehrbenutzer-Lizenzen finden Sie auf der Webseite unter www.acciu.de/watchdog.
Die Testversion von vbWatchdog finden Sie unter dem gleichen Link. Nach dem Download starten Sie die .exe-Datei, die ein COM-Add-In für den VBA-Editor installiert. Dieses fügen Sie im VBA-Editor über den Menüeintrag Add-Ins|vbWatchdog|Add vbWatchdog to this project zum aktuellen VBA-Projekt hinzu (s. Abb. 1).
Abb. 1: Einfügen des vbWatchdog in ein VBA-Projekt
Dies fügt dem aktuellen Projekt vier Klassenmodule hinzu, welche die komplette Funktionalität enthalten - es sind keine externen DLLs et cetera nötig (s. Abb. 2). Sie geben vbWatchdog also als Teil der Anwendung weiter.
Abb. 2: Die vier Klassen des vbWatchdog
Und damit kann die Fehlerbehandlung schon beginnen: Sie brauchen vbWatchdog nur zu aktivieren und schon kümmert sich das Tool um alle auftretenden Laufzeitfehler. Die Aktivierung erfolgt im einfachsten Fall mit der folgenden Anweisung (eine Instanzierung der Klasse ErrEx ist nicht nötig):
Public Sub vbWatchdogAktivieren()
Call ErrEx.Enable("")
End Sub
Damit sorgen Sie dafür, dass vbWatchdog im Fehlerfall seinen eingebauten Dialog anzeigt. Nehmen wir an, Sie starten bei aktiviertem vbWatchdog die folgende Prozedur:
Public Sub Testfehler()
Debug.Print 1 / 0
End Sub
Die resultierende Fehlermeldung sieht dann wie in Abb. 3 aus. Wenn Sie nicht mehr mit vbWatchdog arbeiten möchten, deaktivieren Sie es mit der folgenden Anweisung:
Abb. 3: Eine einfache Fehlermeldung des vbWatchdog
ErrEx.Disable
Wenn Sie nicht die eingebaute Fehlermeldung von vbWatchdog sehen wollen, können Sie selbst eine globale Fehlerbehandlungsroutine angeben. Dazu aktivieren Sie vbWatchdog wie oben, geben aber den Namen der Prozedur an, die im Falle eines Fehlers aufgerufen werden soll:
Public Sub vbWatchdogMitEigenerMeldung()
Call ErrEx.Enable("aiuFehlerbehandlung")
End Sub
Die eigene Fehlerbehandlung soll in der Prozedur aiuFehlerbehandlung erfolgen und sich zunächst einfach per Meldungsfenster zu Wort melden:
Public Sub aiuFehlerbehandlung()
MsgBox "Fehler!"
End Sub
Lösen Sie nun erneut einen Fehler aus, erscheint erst das Meldungsfenster und dann erneut der eingebaute Dialog von vbWatchdog.
Fehler protokollieren
Die Fehlerbehandlungsprozedur aiuFehlerbehandlung können Sie beispielsweise nutzen, um die Fehler in Tabellen zu dokumentieren. Dazu legen Sie zunächst eine einfache Fehlertabelle wie in Abb. 4 an. Normalerweise würden Sie hier auch Informationen wie Projektname, Prozedurname, Modulname, Zeilennummer oder den Inhalt der fehlerhaften Zeile eintragen.
Abb. 4: Tabellen zum Speichern von Fehlern ...
Nun bietet vbWatchdog allerdings auch noch die Möglichkeit, Informationen aller Routinen auszugeben, die zum Auslösen des Fehlers geführt haben. Wenn also die Prozedur Testfehler2 die Prozedur Testfehler1 aufruft und diese wiederum die Prozedur Testfehler, in der schließlich ein Fehler auftritt, dann kann es für den Entwickler von großem Nutzen sein, wenn er diesen Hergang kennt. Die Informationen dieses sogenannten Fehlerstacks liefert vbWatchdog ebenfalls, weshalb wir diese Informationen in eine weitere, per 1:n-Beziehung mit der Tabelle tblFehler verknüpfte Tabelle namens tblFehlerstack auslagern (s. Abb. 5). Ein Beispiel für Einträge in diese Tabellen finden Sie in Abb. 6.
Abb. 5: ... und der Schritte, die dazu führten.
Abb. 6: Dokumentation eines einfachen Fehlers
Variablen zum Fehlerzeitpunkt archivieren
Wenn wir schon beim Archivieren sind, legen wir auch gleich noch eine dritte Tabelle zum Speichern der Variablen und ihrer Inhalte zum Zeitpunkt des Fehlers an. Diese sieht wie in Abb. 7 aus und ist über das Feld FehlerstackID mit der Tabelle tblFehlerstack verknüpft.
Abb. 7: Speichern der Variablen zum Zeitpunkt eines Fehlers
Archivieren von Fehlern, Stack und Variablen
Nun passen wir die Fehlerbehandlungs-Prozedur so an, dass sie die gewünschten Daten in die beiden Tabellen schreibt. Das Ergebnis sieht wie in Listing 1 aus. Die Prozedur verwendet zunächst die beiden Eigenschaften Number und Description des ErrEx-Objekts und schreibt diese in die Tabelle tblFehler. Dann durchläuft sie eine Do...Loop-Schleife und schreibt in jedem Durchlauf die Eigenschaften ProjectName, ModuleName, ProcedureName, LineNumber und LineCode des CallStack-Elements in die zweite Tabelle. Außerdem trägt sie dort die ID des soeben hinzugefügten Eintrags der Tabelle tblFehler hinzu, damit die Stack-Informationen dem Fehler zugeordnet werden können. Abb. 6 zeigt, wie das für einen einfachen Fehler aussehen kann, der über drei Prozeduren angestoßen wurde.
Listing 1: Speichern von Fehlerinformationen in drei Tabellen
Public Sub aiuFehlerbehandlung()
Dim db As DAO.Database
Dim lngFehlerID As Long
Dim lngStackID As Long
Dim strSQLError As String
Dim strSQLErrorstack As String
Dim strSQLVariablen As String
Set db = CurrentDb
With ErrEx
strSQLError = "INSERT INTO tblFehler(Fehlerzeit, Fehlernummer, Fehlerbeschreibung) VALUES(" _
& ISODatum(Now) & ", " & .Number & ", '" & .Description & "')"
db.Execute strSQLError, dbFailOnError
lngFehlerID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
With ErrEx.Callstack
Do
strSQLErrorstack = "INSERT INTO tblFehlerstack(Projektname, Modulname, Prozedurname, " _
& "Zeilennummer, Zeileninhalt, FehlerID) VALUES('" & .ProjectName & "','" _
& .ModuleName & "','" & .ProcedureName & "'," & .LineNumber & ",'" & .LineCode _
& "'," & lngFehlerID & ")"
db.Execute strSQLErrorstack, dbFailOnError
lngStackID = db.OpenRecordset("SELECT @@IDENTITY").Fields(0)
|