{"id":55000856,"date":"2012-10-01T00:00:00","date_gmt":"2020-05-22T21:48:46","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=856"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fehlerbehandlung_in_der_Praxis","status":"publish","type":"post","link":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/","title":{"rendered":"Fehlerbehandlung in der Praxis"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28\" width=\"1\" height=\"1\" alt=\"\"><\/p>\n<p><b>Die Fehlerbehandlung ist, wenn man sie konsequent betreibt, erstens eine Menge Schreibarbeit und zweitens, wenn man die Fehlerbehandlung halbautomatisch hinzuf&uuml;gt, eine Fehlerquelle. Mit dem Einsatz von vbWatchdog sieht das anders aus. Dieser Beitrag zeigt, wie sich diese Methode der Fehlerbehandlung im Praxiseinsatz bew&auml;hrt.<\/b><\/p>\n<p>Das Tool <b>vbWatchdog <\/b>haben wir bereits im Beitrag <b>Fehlerbehandlung mit vbWatchdog <\/b>(<b>www.access-im-unternehmen.de\/779<\/b>) vorgestellt. Im vorliegenden Beitrag schauen wir uns ein Beispiel einer in einer Anwendung eingesetzten Fehlerbehandlung an, die zwei verschiedene Modi zul&auml;sst &#8211; einen f&uuml;r den Produktiveinsatz und einen f&uuml;r die Entwicklung.<\/p>\n<p><b>vbWatchdog <\/b>k&ouml;nnen Sie unter folgendem Link herunterladen:<\/p>\n<pre>http:\/\/www.everythingaccess.com\/vbwatchdog.htm<\/pre>\n<p>Dort gibt es auch eine kostenlose Testversion.<\/p>\n<p>Nach der Installation finden Sie im VBA-Editor einen Men&uuml;-Eintrag namens <b>Add-Ins|vbWatchdog|Add vbWatchdog to this project<\/b>, mit dem Sie schlicht und einfach ein paar Klassen zum aktuellen VBA-Projekt hinzuf&uuml;gen. Schlie&szlig;lich m&uuml;ssen Sie die Fehlerbehandlung noch aktivieren, wobei Sie gegebenenfalls sogar verschiedene Fehlerbehandlungen verwenden k&ouml;nnen.<\/p>\n<p>Im Beispiel dieses Beitrags, der Datenbank aus dem Beitrag <b>Kunden, Vertr&auml;ge und Anschreiben verwalten <\/b>(<b>www.access-im-unternehmen.de\/854<\/b>), kommen gleich zwei verschiedene Fehlerbehandlungen zum Einsatz.<\/p>\n<p>Die erste ist f&uuml;r den Produktiveinsatz gedacht und liefert im Falle eines Fehlers eine Fehlermeldung, die den Benutzer nicht mit unn&ouml;tigen und nichtssagenden Informationen belastet, sondern diesem schlicht und einfach die M&ouml;glichkeit bietet, die Fehlerinformationen zum Entwickler der Anwendung zu senden. Diese Fehlermeldung sieht beispielsweise wie in Bild 1 aus.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic001.png\" alt=\"pic001.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 1: F&uuml;r den Benutzer gedachte Fehlermeldung<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>Mit Outlook per E-Mail senden <\/b>f&uuml;hrt dann zum &Ouml;ffnen einer E-Mail mit einigen Informationen, die dem Entwickler beim Beheben des Fehlers behilflich sein k&ouml;nnten (s. Bild 2).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic002.png\" alt=\"pic002.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 2: Fehlermeldung per E-Mail<\/span><\/b><\/p>\n<p>Der Benutzer kann den Inhalt der Fehlermeldung auch noch in die Zwischenablage kopieren und diese dann selbstst&auml;ndig an den Entwickler versenden &#8211; gegebenenfalls existiert auf der Zielmaschine ja gar kein Outlook.<\/p>\n<p>Die zweite Variante der Fehlerbehandlung ist auf die Phase der Entwicklung der Anwendung ausgelegt. Sie soll nur f&uuml;r den Entwickler sichtbar sein und erlaubt auch das Debuggen des Fehlers.<\/p>\n<p>Die in der Beispieldatenbank verwendete Fehlerbehandlung f&uuml;r den Entwicklermodus liefert Fehlermeldungen wie die aus Bild 3.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic003.png\" alt=\"pic003.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 3: Entwickler-geeignete Fehlermeldung &#8230;<\/span><\/b><\/p>\n<p>Ein Klick auf die Schaltfl&auml;che <b>Variablen anzeigen <\/b>liefert auch noch alle Variablen zum Zeitpunkt des Fehlers (s. Bild 4).<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic004.png\" alt=\"pic004.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 4: &#8230; mit Auflistung der Variablen zum Fehlerzeitpunkt<\/span><\/b><\/p>\n<p>Wenn Sie diese Fehlermeldungen einfach &uuml;bernehmen m&ouml;chten, gelingt dies recht einfach. Tragen Sie zun&auml;chst einen Aufruf wie den folgenden in einer Prozedur ein, die beim Start der Anwendung aufgerufen wird &#8211; beispielsweise in die <b>Beim Laden<\/b>-Ereignisprozedur eines Startformulars:<\/p>\n<pre>Private Sub Form_Load()\r\n    ErrEx_Starten\r\n    End Sub<\/pre>\n<p>Die dadurch aufgerufene Prozedur finden Sie im Modul <b>mdlError<\/b>, das Sie der Zielanwendung hinzuf&uuml;gen m&uuml;ssen:<\/p>\n<pre>Public Sub ErrEx_Starten()\r\nIf VBA.Command() = &quot;Developer&quot; Then\r\n Errordialog_Entwickler\r\nElse\r\n Errordialog_Benutzer\r\nEnd If\r\nEnd Sub<\/pre>\n<p>Die Prozedur pr&uuml;ft, ob die Funktion <b>Command <\/b>den Wert <b>Developer <\/b>zur&uuml;ckliefert. Hier gibt es eine Querverbindung zum Beitrag <b>Datenbanken im Produktiv- und Entwicklermodus <\/b>(<b>www.access-im-unternehmen.de\/855<\/b>).<\/p>\n<p>Dieser Beitrag beschreibt eine Starter-Datenbank, mit der Sie festlegen k&ouml;nnen, mit welchen Eigenschaften eine Datenbank gestartet wird.<\/p>\n<p>Dort geben Sie einem Aufruf der Zieldatenbank unter anderem einen Parameter namens <b>cmd <\/b>mit, der beispielsweise den Wert <b>Developer <\/b>enth&auml;lt. Sollten Sie die Zieldatenbank also mit einer Verkn&uuml;pfung &ouml;ffnen, die den Parameter <b>\/cmd &quot;Developer&quot; <\/b>enth&auml;lt, w&uuml;rde die Funktion <b>Command <\/b>den Wert <b>Developer <\/b>liefern, was wiederum dazu f&uuml;hrt, dass die Prozedur <b>Errordialog_Entwickler <\/b>aufgerufen wird. In allen anderen F&auml;llen wird die Prozedur <b>Errordialog_Benutzer <\/b>zum Einrichten der Fehlerbehandlung f&uuml;r diese Instanz der Anwendung aufgerufen.<\/p>\n<p>Die beiden Prozeduren <b>Errordialog_Entwickler<\/b> und <b>Errordialog_Benutzer <\/b>sorgen also f&uuml;r die Einrichtung der Fehlerbehandlung. Schauen wir uns in den folgenden Abschnitten an, wie dies im Detail aussieht.<\/p>\n<p><b>Entwickler-Fehlermeldung<\/b><\/p>\n<p>Die Fehlermeldung, die der Entwickler zu sehen bekommen soll, wird durch die Prozedur <b>Errordialog_Entwickler <\/b>definiert (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-58-anchor\">Listing 1<\/a><\/span>). Diese Prozedur aktiviert auch die Fehlerbehandlung durch <b>vbWatchdog<\/b>. Die erste Anweisung beendet eine eventuell laufende Fehlerbehandlung und startet diese neu. Dass die Methode <b>Err.Enable <\/b>nur eine leere Zeichenkette als Parameter erh&auml;lt, liegt daran, dass beim Auftreten eines Fehlers keine weiteren Aktionen mit Ausnahme der Anzeige der Fehlermeldung erfolgen sollen.<\/p>\n<p class=\"listingueberschrift\">Listing 1: Einrichten und Aktivieren des Entwickler-Fehlerdialogs<\/p>\n<pre>Public Sub Errordialog_Entwickler()\r\n    ErrEx.Disable\r\n    ErrEx.Enable &quot;&quot;\r\n    With ErrEx.DialogOptions\r\n        .HTML_MainBody = &quot;&lt;font face=Arial size=13pt color=&quot;&quot;#4040FF&quot;&quot;&gt;&lt;b&gt;&quot; _\r\n            &amp; &quot;Es ist ein Laufzeitfehler aufgetreten.&lt;\/b&gt;&lt;\/font&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;ERRDESC&gt;&lt;\/b&gt;&lt;br&gt;&lt;br&gt;&quot; _\r\n            &amp; &quot;Projekt:|&lt;SOURCEPROJ&gt;&lt;br&gt;Modul:|&lt;SOURCEMOD&gt;&lt;br&gt;Prozedur:|&lt;SOURCEPROC&gt;&lt;br&gt;&quot; _\r\n            &amp; &quot;Fehlernummer:|&lt;ERRNUMBER&gt;&lt;br&gt;Fehlermeldung:|&lt;ERRDESC&gt;&lt;br&gt;Zeile:|&lt;SOURCELINENUMBER&gt;&quot; _\r\n            &amp; &quot;&lt;br&gt;Zeileninhalt:|&lt;SOURCELINECODE&gt;&lt;br&gt;Datum und Zeit:|&lt;ERRDATETIME&gt;&lt;br&gt;&lt;br&gt;&lt;b&gt;&lt;u&gt;&quot; _\r\n            &amp; &quot;Was m&ouml;chten Sie tun&lt;\/u&gt;&lt;\/b&gt;&quot;\r\n        .HTML_CallStackItem = &quot;&lt;b&gt;&lt;font color=#303030&gt;&lt;SOURCEPROJ&gt;.&lt;SOURCEMOD&gt;.&lt;SOURCEPROC&gt;&quot; _\r\n            &amp; &quot;&lt;\/font&gt;&lt;\/b&gt;&lt;br&gt; |&lt;font bgcolor=#F8F8F8&gt;Zeile &lt;SOURCELINENUMBER&gt;: &lt;i&gt;&quot; _\r\n            &amp; &quot;&lt;SOURCELINECODE&gt;&lt;\/i&gt;&lt;\/font&gt;&lt;br&gt;&quot;\r\n        .HTML_MoreInfoBody = &quot;&lt;br&gt;&lt;b&gt;&lt;font face=Arial size=13pt color=#FFFFFF bgcolor=#C0C0C0&gt;&quot; _\r\n            &amp; &quot; Aufrufeliste &lt;\/font&gt;&lt;\/b&gt;&lt;br&gt;&lt;br&gt;&lt;CALLSTACK&gt;&quot;\r\n        .RemoveAllButtons\r\n        .AddButton &quot;Variablen anzeigen&quot;, BUTTONACTION_SHOWVARIABLES\r\n        .AddButton &quot;Quellcode debuggen&quot;, BUTTONACTION_ONERRORDEBUG\r\n        .AddButton &quot;Ignorieren und fortsetzen&quot;, BUTTONACTION_ONERRORRESUMENEXT\r\n        .AddButton &quot;Beenden&quot;, BUTTONACTION_ONERROREND\r\n        .AddButton &quot;Hilfe&quot;, BUTTONACTION_SHOWHELP\r\n        .MoreInfoCaption = &quot;Details einblenden&quot;\r\n        .LessInfoCaption = &quot;Details ausblenden&quot;\r\n        .ShowMoreInfoButton = True\r\n        .WindowCaption = &quot;Fehler im Projekt ''&lt;SOURCEPROJ&gt;''&quot;\r\n    End With\r\n    With ErrEx.VariablesDialogOptions\r\n        .WindowCaption = &quot;Variablenliste&quot;\r\n        .HTML_CallStackItem = &quot;&lt;b&gt;&lt;SOURCEPROJ&gt;.&lt;SOURCEMOD&gt;.&lt;SOURCEPROC&gt;&lt;\/b&gt;&lt;br&gt;&lt;br&gt;&lt;VARIABLES&gt;&lt;br&gt;&quot;\r\n        .HTML_MainBody = &quot;&lt;CALLSTACK&gt;&quot;\r\n        .HTML_MoreInfoBody = &quot;&quot;\r\n        .HTML_VariableItem = &quot;&lt;font color=#808080&gt;(&lt;VARSCOPE&gt;)&lt;\/font&gt;|&quot; _\r\n            &amp; &quot;&lt;VARNAME&gt; As &lt;VARTYPE&gt;| = &lt;VARVALUE&gt;&lt;br&gt;&quot;\r\n        .RemoveAllButtons\r\n        .AddButton &quot;Schlie&szlig;en&quot;, BUTTONACTION_VARIABLES_CLOSE\r\n    End With\r\nEnd Sub<\/pre>\n<p>Diese enth&auml;lt bereits alle notwendigen Informationen, sodass diese nicht etwa in der Zwischenablage oder in einer Tabelle zur weiteren Verarbeitung gespeichert werden m&uuml;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&uuml;r verwendete Objekt hei&szlig;t <b>DialogOptions<\/b>. Es enth&auml;lt beispielsweise eine Eigenschaft namens <b>HTML_MainBody<\/b>. Damit legen Sie fest, wie die Meldung aussehen soll. Dabei werden einige Platzhalter wie etwa <b>&lt;ERRDESC&gt;<\/b>, <b>&lt;SOURCEPROJ&gt;<\/b>, <b>&lt;SOURCEMOD&gt;<\/b>, <b>&lt;SOURCEPROJ&gt;<\/b>, <b>&lt;ERRNUMBER&gt;<\/b>, <b>&lt;ERRDESC&gt;<\/b>, <b>&lt;SOURCELINENUMBER&gt;<\/b>, <b>&lt;SOURCELINECODE&gt;<\/b> und <b>&lt;ERRDATETIME&gt;<\/b> verwendet &#8211; deren Funktion erkl&auml;rt sich eigentlich von selbst.<\/p>\n<p>Die Eigenschaft <b>HTML_CallStackItem <\/b>nimmt die Aufrufe der Prozeduren bis zum Fehler und <b>HTML_MoreInfoBody <\/b>die &Uuml;berschrift f&uuml;r den erweiterten Bereich entgegen. Schauen wir uns an, wo diese Daten f&uuml;r einen einfachen Fehler wie den aus dem folgendem Beispiel landen:<\/p>\n<pre>Public Sub Fehlerbeispiel()\r\n    Dim i As Integer\r\n    For i = 3 To 0 Step -1\r\n         Debug.Print 1 \/ i\r\n    Next i\r\nEnd Sub<\/pre>\n<p>Bild 5 zeigt einige der Bereiche, die per HTML definiert wurden. Wenn Sie auf <b>Details einblenden <\/b>klicken, wird auch noch der mit der Eigenschaft <b>HTML_MoreInfoBody <\/b>festgelegte Bereich sichtbar &#8211; der wiederum mit <b>&lt;Callstack&gt; <\/b>den f&uuml;r die Eigenschaft <b>HTML_CallStackItem <\/b>definierten Bereich einbindet. <\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic005.png\" alt=\"pic005.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 5: Verschiedene Bereiche der Fehlermeldung<\/span><\/b><\/p>\n<p><!--30percent--><\/p>\n<p>Die <b>RemoveAllButtons<\/b>-Methode entfernt alle eingebauten Schaltfl&auml;chen, die folgenden Methoden f&uuml;gen die gew&uuml;nschten Schaltfl&auml;chen hinzu. Dabei erwartet der erste Parameter jeweils die Beschriftung, der zweite f&uuml;gt eine Konstante f&uuml;r eine der eingebauten Funktionen hinzu.<\/p>\n<p>So erh&auml;lt die Schaltfl&auml;che, welche die Liste der aktuell verwendeten Variablen und ihrer Werte anzeigen soll, die Beschriftung <b>Variablen anzeigen <\/b>als ersten Parameter und die Konstante <b>BUTTONACTION_SHOWVARIABLES <\/b>als zweiten Parameter.<\/p>\n<p>Die Schaltfl&auml;che zum Anzeigen weiterer Informationen passen Sie auf eine andere Art an, n&auml;mlich indem Sie diese mit der Eigenschaft <b>ShowMoreInfoButton <\/b>einblenden und die Beschriftung mit der Eigenschaft <b>MoreInfoCaption <\/b>anpassen. Gleiches gilt f&uuml;r die Schaltfl&auml;che, welche die Details wieder ausblendet.<\/p>\n<p>Den mit der <b>Details einblenden<\/b>-Schaltfl&auml;che angezeigten Bereich definieren Sie, wie bereits erw&auml;hnt, mit der Eigenschaft <b>HTML_MoreInfoBody<\/b>.<\/p>\n<p>Fehlt noch der Bereich, der beim Klick auf die Schaltfl&auml;che <b>Variablen anzeigen <\/b>ge&ouml;ffnet wird (s. Bild 6). Diesen stellen Sie mit den Eigenschaften des Objekts <b>VariablesDialogOptions <\/b>ein.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic006.png\" alt=\"pic006.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 6: &Uuml;bersicht der Variablen<\/span><\/b><\/p>\n<p>Hier werden wieder einige Elemente verschachtelt. <b>HTML_Mainbody <\/b>legt fest, welcher Inhalt im Variablenfenster erscheinen soll. In diesem Fall ist dies <b>&lt;Callstack&gt;<\/b>, was mit den einzelnen Callstack-Elementen gef&uuml;llt wird.<\/p>\n<p>Deren Aussehen wird durch den Inhalt der Eigenschaft <b>HTML_CallstackItem <\/b>beschrieben. <b>HTML_CallstackItem <\/b>enth&auml;lt wiederum das Element <b>&lt;VARIABLES&gt;<\/b>, das durch eine der Liste der Variablen, formatiert wie in der Eigenschaft <b>HTML_VariableItem <\/b>vorgegeben, ersetzt wird. Auch hier werden wieder alle eingebauten Schaltfl&auml;chen entfernt und nur eine einzige Schaltfl&auml;che mit der Beschriftung <b>Schlie&szlig;en <\/b>hinzugef&uuml;gt.<\/p>\n<p>Der Entwickler-Fehlerdialog bietet neben der Anzeige der Variablen auch noch die M&ouml;glichkeit, einfach den Quellcode zu debuggen &#8211; er arbeitet in dieser Hinsicht genau wie der VBA-eigene Fehlerdialog.<\/p>\n<p><b>Benutzer-Fehlerdialog<\/b><\/p>\n<p>Der Benutzer soll, wie bereits erw&auml;hnt, nur die Information erhalten, dass ein Fehler aufgetreten ist, und die Fehlerinformationen m&ouml;glichst an den Entwickler schicken.<\/p>\n<p>Dies realisieren wir durch einen integrierten Aufruf von Outlook (wir gehen an dieser Stelle davon aus, dass sich auf dem Zielrechner Outlook befindet).<\/p>\n<p>Die Einrichtung des Benutzer-Dialogs sieht deutlich einfacher aus als die des Entwickler-Dialogs (s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-62-anchor\">Listing 2<\/a><\/span>).<\/p>\n<p class=\"listingueberschrift\">Listing 2: Einrichten und Aktivieren des Benutzer-Fehlerdialogs<\/p>\n<pre>Public Sub Errordialog_Benutzer()\r\n    Dim strMainBody As String\r\n    ErrEx.Disable\r\n    ErrEx.Enable &quot;DatenSammeln&quot;\r\n    With ErrEx.DialogOptions\r\n        strMainBody = &quot;&lt;font face=Arial size=13pt color=&quot;&quot;#4040FF&quot;&quot;&gt;&lt;b&gt;Es ist ein Laufzeitfehler &quot; _\r\n            &amp; &quot;aufgetreten.&lt;\/b&gt;&lt;\/font&gt;&lt;br&gt;&quot;\r\n        strMainBody = strMainBody &amp; &quot;Sie k&ouml;nnen helfen, diesen Fehler zu beheben, indem Sie uns &quot; _\r\n            &amp; &quot;eine E-Mail mit der Beschreibung des Fehlers zusenden.&lt;br&gt;&lt;br&gt;&quot;\r\n        strMainBody = strMainBody &amp; &quot;Schicken Sie die Fehlerbeschreibung direkt mit Outlook oder &quot; _\r\n            &amp; &quot;kopieren Sie diese in die Zwischenablage und senden Sie sie an ''&lt;Entwickleradresse&gt;''&quot;\r\n        .HTML_MainBody = strMainBody\r\n        .RemoveAllButtons\r\n        .ShowMoreInfoButton = False\r\n        .AddCustomButton &quot;Mit Outlook per E-Mail senden&quot;, &quot;ErrorMail&quot;\r\n        .AddCustomButton &quot;Fehlerinfo in Zwischenablage&quot;, &quot;ErrorClipboard&quot;\r\n        .AddButton &quot;Beenden&quot;, BUTTONACTION_ONERROREND\r\n        .DefaultButtonID = 2\r\n        .WindowCaption = &quot;Fehler in der Beispieldatenbank zum Buch ''AEMA''&quot;\r\n    End With\r\nEnd Sub<\/pre>\n<p>Dieser verwendet weitgehend die bereits beschriebenen Elemente, allerdings gibt es auch zwei neue Elemente. Die Definition enth&auml;lt n&auml;mlich zwei benutzerdefinierte Schaltfl&auml;chen, die nicht die eingebauten Funktionen aufrufen, sondern benutzerdefinierte Funktionen:<\/p>\n<pre>.AddCustomButton &quot;Mit Outlook per E-Mail senden&quot;, &quot;ErrorMail&quot;\r\n.AddCustomButton &quot;Fehlerinfo in Zwischenablage&quot;, &quot;ErrorClipboard&quot;<\/pre>\n<p>Hier gibt der erste Parameter auch wieder die Beschriftung der Schaltfl&auml;che an, der zweite jedoch legt die Funktion fest, die beim Anklicken der Schaltfl&auml;che durch den Benutzer ausgel&ouml;st werden soll.<\/p>\n<p>Dabei soll die erste Schaltfl&auml;che eine Funktion namens <b>ErrorMail <\/b>aufrufen, die dazu dient, die Fehlerinformationen per E-Mail an den Entwickler zu senden.<\/p>\n<p>Die zweite ist f&uuml;r den Fall vorgesehen, dass der Benutzer kein Outlook verwendet, die Fehlerinformationen aber dennoch mit seiner individuellen E-Mail-Software versenden m&ouml;chte. Beide Funktionen schauen wir uns im Anschluss an.<\/p>\n<p>Desweiteren findet sich im Code noch eine interessante &auml;nderung: Die Aktivierung der Fehlerbehandlung mit der <b>Enable<\/b>-Methode des <b>ErrEx<\/b>-Objekts geschieht diesmal n&auml;mlich nicht mit einer leeren Zeichenkette, sondern mit der Zeichenkette <b>DatenSammeln <\/b>als Wert.<\/p>\n<p>Damit geben Sie den Namen einer Funktion an, die beim Auftreten eines Fehlers ausgel&ouml;st werden soll. Warum das, wenn doch bereits Funktionen durch Mausklicks auf entsprechende Schaltfl&auml;chen der Fehlermeldung ausgef&uuml;hrt werden k&ouml;nnen Der Grund ist einfach: Nur die hier angegebene Funktion hat Zugriff auf die Fehlerinformationen des <b>ErrEx<\/b>-Objekts.<\/p>\n<p>Das hei&szlig;t, dass wir an dieser Stelle die Informationen sammeln, in einer Tabelle zwischenspeichern und diese dann, abh&auml;ngig von der vom Benutzer gew&auml;hlten Aktion, entweder per E-Mail versenden oder in die Zwischenablage kopieren, damit der Benutzer diese anderweitig weiterverwerten kann.<\/p>\n<p>Die Funktion hei&szlig;t in diesem Fall <b>DatenSammeln<\/b> und sieht wie in <span class=\"verweis-ohneumbruch\"><a href=\"#anker-68-anchor\">Listing 3<\/a><\/span> aus. Die Prozedur pr&uuml;ft zun&auml;chst mit der Eigenschaft <b>State<\/b>, in welchem Kontext der Fehler ausgel&ouml;st wurde. Wenn diese Eigenschaft den Wert <b>OnErrorResumeNext <\/b>liefert, bedeutet dies, dass die Fehlerbehandlung zuvor mit der Anweisung <b>On Error Resume Next <\/b>deaktiviert wurde. In diesem Fall soll die Prozedur <b>DatenSammeln <\/b>gleich wieder beendet werden. Dazu noch ein Hinweis: Auch wenn bei durch <b>On Error Resume Next <\/b>deaktivierter Fehlerbehandlung dennoch die Prozedur <b>DatenSammeln <\/b>aufgerufen wird, so zeigt <b>vbWatchdog <\/b>doch keine Fehlermeldung an. Sie k&ouml;nnten also auf diese Weise dennoch protokollieren, ob Fehler in Bereichen, die zuvor mit <b>On Error Resume Next <\/b>behandelt wurden, ausgel&ouml;st wurden und wodurch.<\/p>\n<p class=\"listingueberschrift\">Listing 3: Zusammenstellung der Daten f&uuml;r den Fehlerbericht<\/p>\n<pre>Public Sub DatenSammeln()\r\n    Dim strError As String\r\n    Dim strSQL As String\r\n    Dim db As DAO.Database\r\n    If ErrEx.State = OnErrorResumeNext Then Exit Sub\r\n        Set db = CurrentDb\r\n        With ErrEx\r\n            strError = strError &amp; &quot;Datum: &quot; &amp; Now &amp; vbCrLf\r\n            strError = strError &amp; &quot;Fehlernummer: &quot; &amp; .Number &amp; vbCrLf\r\n            strError = strError &amp; &quot;Beschreibung: &quot; &amp; .Description &amp; vbCrLf\r\n            With ErrEx.Callstack\r\n                Do\r\n                     strError = strError &amp; &quot; Projektname: &quot; &amp; .ProjectName &amp; vbCrLf\r\n                    strError = strError &amp; &quot; Modulname: &quot; &amp; .ModuleName &amp; vbCrLf\r\n                    strError = strError &amp; &quot; Prozedurname: &quot; &amp; .ProcedureName &amp; vbCrLf\r\n                    strError = strError &amp; &quot; Zeilennummer: &quot; &amp; .LineNumber &amp; vbCrLf\r\n                    strError = strError &amp; &quot; Zeileninhalt: &quot; &amp; .LineCode &amp; vbCrLf\r\n                    With ErrEx.Callstack.VariablesInspector\r\n                        .FirstVar\r\n                        Do While Not .IsEnd\r\n                            strError = strError &amp; &quot; Variablenname: &quot; &amp; .Name &amp; vbCrLf\r\n                            If .Name = &quot;ref&quot; Then\r\n                                strError = strError &amp; &quot; Variablenwert: Nicht vorhandener Verweis&quot; &amp; vbCrLf\r\n                            Else\r\n                                Select Case VarType(.Value)\r\n                                    Case 9\r\n                                        strError = strError &amp; &quot; Variablenwert: &quot; &amp; TypeName(.Value) _\r\n                                                    &amp; vbCrLf\r\n                                    Case 13\r\n                                        strError = strError &amp; &quot; Variablenwert: Nothing&quot; &amp; vbCrLf\r\n                                    Case 8200\r\n                                        strError = strError &amp; &quot; Variablenwert: Array&quot; &amp; vbCrLf\r\n                                    Case 0\r\n                                        strError = strError &amp; &quot; Variablenwert: Leer&quot; &amp; vbCrLf\r\n                                    Case Else\r\n                                        strError = strError &amp; &quot; Variablenwert: &quot; &amp; .Value &amp; vbCrLf\r\n                                End Select\r\n                            End If\r\n                            strError = strError &amp; &quot; Datentyp: &quot; &amp; .TypeDesc &amp; vbCrLf\r\n                            strError = strError &amp; &quot; Gueltigkeitsbereich: &quot; &amp; .Scope &amp; vbCrLf\r\n                            .NextVar\r\n                        Loop\r\n                End With\r\n            Loop While .NextLevel\r\n        End With\r\n    End With\r\n    strSQL = &quot;UPDATE tblFehler SET LetzterFehler = ''&quot; &amp; Replace(strError, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;''&quot;\r\n    db.Execute strSQL, dbFailOnError\r\n    If Not Err.Number = 0 Then\r\n         strSQL = &quot;INSERT INTO tblFehler(LetzterFehler) VALUES(''&quot; &amp; Replace(strError, &quot;''&quot;, &quot;''''&quot;) &amp; &quot;'')&quot;\r\n        db.Execute strSQL, dbFailOnError\r\n    End If\r\nEnd Sub<\/pre>\n<p>Die folgenden Anweisungen f&uuml;gen alle Fehlerinformationen in der Variablen <b>strError<\/b> zu einem l&auml;ngeren Text zusammen. Dazu geh&ouml;ren zun&auml;chst f&uuml;r jeden Fehler Informationen wie Datum, Fehlernummer und Beschreibung. Danach durchl&auml;uft die Prozedur den Callstack und innerhalb des Callstacks die im jeweiligen Kontext g&uuml;ltigen Variablen. Alle Informationen werden zusammengetragen und schlie&szlig;lich im Feld <b>LetzterFehler <\/b>der Tabelle <b>tblFehler <\/b>gespeichert.<\/p>\n<p>Dabei ist zu beachten, dass etwa die Auflistungen auf verschiedene Arten durchlaufen werden m&uuml;ssen. Zum Durchlaufen des Callstacks etwa wird eine <b>Do&#8230;While<\/b>-Schleife verwendet, die so lange l&auml;uft, wie die Eigenschaft <b>NextLevel <\/b>den Wert <b>True <\/b>enth&auml;lt. <b>NextLevel <\/b>liefert allerdings nicht nur die Information, ob der Callstack noch einen weiteren Eintrag enth&auml;lt, sondern ist gleichzeitig eine Funktion, die den folgenden Eintrag in das Objekt l&auml;dt und es &uuml;ber seine Eigenschaften f&uuml;r den Zugriff per VBA verf&uuml;gbar macht.<\/p>\n<p>Innerhalb eines jeden Callstack-Elements spuckt die Prozedur auch noch alle Variablen samt Inhalt aus. Der Zugriff auf die Variableninhalte per <b>Value<\/b>-Eigenschaft f&uuml;hrte jedoch mehrmals zu Fehlern, weil diese schlicht nicht f&uuml;r die Ausgabe beziehungsweise das Anh&auml;ngen an eine Zeichenkette geeignet waren. Daher pr&uuml;ft die Prozedur nun bereits einige auf diese Weise auff&auml;llig gewordenen Objektvariablen auf ihren Typ und gibt entsprechende Ersatzwerte aus, die auf den jeweiligen Objekttyp hinweisen. Das gilt beispielsweise, wenn es sich bei der Variablen um ein Array oder um eine leere Objektvariable handelt.<\/p>\n<p>Die auf diese Weise zusammengestellte Zeichenkette speichert die Prozedur schlie&szlig;lich in einer einfachen Tabelle, die wie in Bild 7 aufgebaut ist.<\/p>\n<p><img decoding=\"async\" src=\"..\/fileadmin\/_temp_\/2012_05\/FehlerbehandlungInDerPraxis-web-images\/pic007.png\" alt=\"pic007.png\" \/><\/p>\n<p><b><span style=\"color:darkgrey\">Bild 7: In der Tabelle tblFehler gespeicherte Fehlerinformationen<\/span><\/b><\/p>\n<p class=\"listingueberschrift\">Listing 4: Speichern der Fehlerinformationen in der Zwischenablage<\/p>\n<pre>Public Sub ErrorClipboard()\r\n    Dim strError As String\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    strError = strError &amp; &quot;Version FE: &quot; &amp; Nz(DLookup(&quot;Version_FE&quot;, &quot;tblOptionen&quot;), &quot;&quot;) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Version Access: &quot; &amp; Access.Version &amp; &quot; &quot; &amp; SysCmd(acSysCmdAccessVer) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Runtime: &quot; &amp; SysCmd(acSysCmdRuntime) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Version Windows: &quot; &amp; GetWindowsVersion &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datum: &quot; &amp; Format(Now, &quot;yyyy-mm-dd, hh:nn:ss&quot;) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datenbank: &quot; &amp; CodeDb.Name &amp; vbCrLf\r\n    strError = strError &amp; db.OpenRecordset(&quot;SELECT LetzterFehler FROM tblOptionen&quot;, _\r\n        dbOpenDynaset).Fields(0)\r\n    InZwischenablage strError\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;<\/p>\n<p><b>Fehlerinformationen per E-Mail versenden<\/b><\/p>\n<p>Abh&auml;ngig davon, ob der Benutzer sich f&uuml;r einen Klick auf die Schaltfl&auml;che <b>Mit Outlook per E-Mail senden <\/b>oder <b>Fehlerinfo in Zwischenablage <\/b>entscheidet, wird eine der beiden Funktionen <b>ErrorClipboard <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-63-anchor\">Listing 4<\/a><\/span>) oder <b>ErrorMail <\/b>(s. <span class=\"verweis-ohneumbruch\"><a href=\"#anker-65-anchor\">Listing 5<\/a><\/span>) aufgerufen.<\/p>\n<\/p>\n<p class=\"listingueberschrift\">Listing 5: Versenden der Fehlerinformationen per E-Mail<\/p>\n<pre>Public Function ErrorMail() As OnErrorStatus\r\n    Dim db As DAO.Database\r\n    Dim strError As String\r\n    Dim objMail As clsMail\r\n    Set objMail = New clsMail\r\n    Set db = CurrentDb\r\n    strError = strError &amp; &quot;Version FE: &quot; &amp; CurrentDb.Containers(&quot;Databases&quot;). _\r\n        Documents(&quot;Userdefined&quot;).Properties(&quot;Version&quot;).Value &amp; vbCrLf\r\n    strError = strError &amp; &quot;Version Access: &quot; &amp; Access.Version &amp; &quot; &quot; _\r\n        &amp; SysCmd(acSysCmdAccessVer) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Runtime: &quot; &amp; SysCmd(acSysCmdRuntime) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Version Windows: &quot; &amp; GetWindowsVersion &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datum: &quot; &amp; Format(Now, &quot;yyyy-mm-dd, hh:nn:ss&quot;) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datenbank: &quot; &amp; CodeDb.Name &amp; vbCrLf\r\n    strError = strError &amp; db.OpenRecordset(&quot;SELECT LetzterFehler FROM tblFehler&quot;, _\r\n        dbOpenDynaset).Fields(0)\r\n    With objMail\r\n        .Betreff = &quot;Fehlermeldung ''AiU''&quot;\r\n        .Inhalt = strError\r\n        .ToHinzufuegen &quot;andre@minhorst.com&quot;\r\n        .Anzeigen\r\n    End With\r\n    Set db = Nothing\r\n    ErrorMail = OnErrorEnd\r\nEnd Function<\/pre>\n<p>Die Prozedur erstellt zun&auml;chst ein Objekt auf Basis der Klasse <b>clsMail<\/b>. Die Beschreibung dieser Klasse finden Sie im Beitrag <b>Mail mit Klasse <\/b>(<b>www.access-im-unternehmen.de\/859<\/b>). Bevor die neue E-Mail gef&uuml;llt und versendet wird, tr&auml;gt die Prozedur in der Variablen <b>strError <\/b>noch einige allgemeine Informationen zusammen &#8211; beispielsweise die aktuelle Version der Datenbank, die Access-Version, ob Access als Runtime gestartet wurde, welche Windows-Version im Einsatz ist und wie die Datenbank hei&szlig;t.<\/p>\n<p>F&uuml;r Frontend-Backend-L&ouml;sungen empfiehlt es sich noch, auch entsprechende Informationen &uuml;ber die Backend-Datenbank zu integrieren. Diese Daten werden um die im Feld <b>LetzterFehler <\/b>der Tabelle <b>tblFehler <\/b>der Datenbank gespeicherten Daten erg&auml;nzt und schlie&szlig;lich f&uuml;r die Eigenschaft <b>Inhalt <\/b>des Mail-Objekts eingetragen.<\/p>\n<p>Dieses wird au&szlig;erdem mit einem Betreff und einem Adressaten ausgestattet. Die Methode <b>Anzeigen <\/b>&ouml;ffnet die neue E-Mail mit den Fehlerinformationen, damit der Benutzer auch sieht, welche Informationen an den Entwickler gesendet werden.<\/p>\n<p>Sollte der Benutzer die Fehlerinformationen hingegen lieber in der Zwischenablage speichern, l&ouml;st ein Klick auf die entsprechende Schaltfl&auml;che die Funktion aus <span class=\"verweis-ohneumbruch\"><a href=\"#anker-66-anchor\">Listing 6<\/a><\/span> aus. Diese Funktion stellt die gleichen Informationen zusammen wie die Prozedur zum Versenden der E-Mail, allerdings werden die Daten dann schlicht und einfach in die Zwischenablage kopiert. Von dort aus kann der Benutzer diese dann in eine neue E-Mail kopieren oder anderweitig verarbeiten.<\/p>\n<p class=\"listingueberschrift\">Listing 6: Kopieren der Fehlerinformationen in die Zwischenablage<\/p>\n<pre>Public Sub ErrorClipboard()\r\n    Dim strError As String\r\n    Dim db As DAO.Database\r\n    Set db = CurrentDb\r\n    strError = strError &amp; &quot;Version FE: &quot; &amp; CurrentDb.Containers(&quot;Databases&quot;). _\r\n        Documents(&quot;Userdefined&quot;).Properties(&quot;Version&quot;).Value &amp; vbCrLf\r\n     strError = strError &amp; &quot;Version Access: &quot; &amp; Access.Version &amp; &quot; &quot; _\r\n        &amp; SysCmd(acSysCmdAccessVer) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Runtime: &quot; &amp; SysCmd(acSysCmdRuntime) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Version Windows: &quot; &amp; GetWindowsVersion &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datum: &quot; &amp; Format(Now, &quot;yyyy-mm-dd, hh:nn:ss&quot;) &amp; vbCrLf\r\n    strError = strError &amp; &quot;Datenbank: &quot; &amp; CodeDb.Name &amp; vbCrLf\r\n    strError = strError &amp; db.OpenRecordset(&quot;SELECT LetzterFehler FROM tblFehler&quot;, _\r\n        dbOpenDynaset).Fields(0)\r\n    InZwischenablage strError\r\n    Set db = Nothing\r\nEnd Sub<\/pre>\n<p><b>Zusammenfassung und Ausblick<\/b><\/p>\n<p>Auch wenn die erste Integration und das Verst&auml;ndnis des Aufbaus der Fehlermeldung ein wenige Zeit kosten: Sie brauchen mit <b>vbWatchdog <\/b>prinzipiell nur einmalig eine Fehlerbehandlung zu programmieren und k&ouml;nnen diese dann in beliebig vielen Anwendungen einsetzen. Gut, das konnten Sie mit einer eigenen Fehlerbehandlungsroutine auch, aber dort mussten Sie noch s&auml;mtliche Prozeduren mit der entsprechenden Fehlerbehandlung ausstatten. Probieren Sie es aus: Sie werden sehen, wie viel Spa&szlig; es allein macht, die Fehlerbehandlung aus all den Routinen zu entfernen und pl&ouml;tzlich wieder nur den wirklich relevanten Code vor sich zu sehen statt Prozeduren, die vielleicht eine Zeile produktiven Code, daf&uuml;r aber sechs oder sieben Zeilen Fehlerbehandlung enthielten.<\/p>\n<h3>Downloads zu diesem Beitrag<\/h3>\n<p>Enthaltene Beispieldateien:<\/p>\n<p>FehlerbehandlungInDerPraxis_2000.mdb<\/p>\n<p><a href=\"..\/fileadmin\/beispiele\/{85773571-1292-4DEE-94A8-82387453A368}\/aiu_856.zip\">Download<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Fehlerbehandlung ist, wenn man sie konsequent betreibt, erstens eine Menge Schreibarbeit und zweitens, wenn man die Fehlerbehandlung halbautomatisch hinzuf&uuml;gt, eine Fehlerquelle. Mit dem Einsatz von vbWatchdog sieht das anders aus. Dieser Beitrag zeigt, wie sich diese Methode der Fehlerbehandlung im Praxiseinsatz bew&auml;hrt.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"_uf_show_specific_survey":0,"_uf_disable_surveys":false,"footnotes":""},"categories":[662012,66052012,44000025],"tags":[],"class_list":["post-55000856","post","type-post","status-publish","format-standard","hentry","category-662012","category-66052012","category-VBA_und_Programmiertechniken"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.9 (Yoast SEO v27.4) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Fehlerbehandlung in der Praxis - Access im Unternehmen<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Fehlerbehandlung in der Praxis\" \/>\n<meta property=\"og:description\" content=\"Die Fehlerbehandlung ist, wenn man sie konsequent betreibt, erstens eine Menge Schreibarbeit und zweitens, wenn man die Fehlerbehandlung halbautomatisch hinzuf&uuml;gt, eine Fehlerquelle. Mit dem Einsatz von vbWatchdog sieht das anders aus. Dieser Beitrag zeigt, wie sich diese Methode der Fehlerbehandlung im Praxiseinsatz bew&auml;hrt.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/\" \/>\n<meta property=\"og:site_name\" content=\"Access im Unternehmen\" \/>\n<meta property=\"article:published_time\" content=\"2020-05-22T21:48:46+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28\" \/>\n<meta name=\"author\" content=\"Andr\u00e9 Minhorst\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Andr\u00e9 Minhorst\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"19\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/\"},\"author\":{\"name\":\"Andr\u00e9 Minhorst\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\"},\"headline\":\"Fehlerbehandlung in der Praxis\",\"datePublished\":\"2020-05-22T21:48:46+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/\"},\"wordCount\":2446,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/6f10d3f803bc4de1a8492e57f2cd2c28\",\"articleSection\":[\"2012\",\"5\\\/2012\",\"VBA und Programmiertechniken\"],\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/\",\"name\":\"Fehlerbehandlung in der Praxis - Access im Unternehmen\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/6f10d3f803bc4de1a8492e57f2cd2c28\",\"datePublished\":\"2020-05-22T21:48:46+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#primaryimage\",\"url\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/6f10d3f803bc4de1a8492e57f2cd2c28\",\"contentUrl\":\"http:\\\/\\\/vg05.met.vgwort.de\\\/na\\\/6f10d3f803bc4de1a8492e57f2cd2c28\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/Fehlerbehandlung_in_der_Praxis\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Fehlerbehandlung in der Praxis\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#website\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"name\":\"Access im Unternehmen\",\"description\":\"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access\",\"publisher\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/access-im-unternehmen.de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#organization\",\"name\":\"Andr\u00e9 Minhorst Verlag\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"contentUrl\":\"https:\\\/\\\/access-im-unternehmen.de\\\/wp-content\\\/uploads\\\/2019\\\/09\\\/aiu_wp.png\",\"width\":370,\"height\":111,\"caption\":\"Andr\u00e9 Minhorst Verlag\"},\"image\":{\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/access-im-unternehmen.de\\\/#\\\/schema\\\/person\\\/13395c4bcd7d7963efe33be9c584d93f\",\"name\":\"Andr\u00e9 Minhorst\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g\",\"caption\":\"Andr\u00e9 Minhorst\"}}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Fehlerbehandlung in der Praxis - Access im Unternehmen","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/","og_locale":"de_DE","og_type":"article","og_title":"Fehlerbehandlung in der Praxis","og_description":"Die Fehlerbehandlung ist, wenn man sie konsequent betreibt, erstens eine Menge Schreibarbeit und zweitens, wenn man die Fehlerbehandlung halbautomatisch hinzuf&uuml;gt, eine Fehlerquelle. Mit dem Einsatz von vbWatchdog sieht das anders aus. Dieser Beitrag zeigt, wie sich diese Methode der Fehlerbehandlung im Praxiseinsatz bew&auml;hrt.","og_url":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/","og_site_name":"Access im Unternehmen","article_published_time":"2020-05-22T21:48:46+00:00","og_image":[{"url":"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28","type":"","width":"","height":""}],"author":"Andr\u00e9 Minhorst","twitter_card":"summary_large_image","twitter_misc":{"Verfasst von":"Andr\u00e9 Minhorst","Gesch\u00e4tzte Lesezeit":"19\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#article","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/"},"author":{"name":"Andr\u00e9 Minhorst","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f"},"headline":"Fehlerbehandlung in der Praxis","datePublished":"2020-05-22T21:48:46+00:00","mainEntityOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/"},"wordCount":2446,"commentCount":0,"publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28","articleSection":["2012","5\/2012","VBA und Programmiertechniken"],"inLanguage":"de","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/","url":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/","name":"Fehlerbehandlung in der Praxis - Access im Unternehmen","isPartOf":{"@id":"https:\/\/access-im-unternehmen.de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#primaryimage"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#primaryimage"},"thumbnailUrl":"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28","datePublished":"2020-05-22T21:48:46+00:00","breadcrumb":{"@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#primaryimage","url":"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28","contentUrl":"http:\/\/vg05.met.vgwort.de\/na\/6f10d3f803bc4de1a8492e57f2cd2c28"},{"@type":"BreadcrumbList","@id":"https:\/\/access-im-unternehmen.de\/Fehlerbehandlung_in_der_Praxis\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/access-im-unternehmen.de\/"},{"@type":"ListItem","position":2,"name":"Fehlerbehandlung in der Praxis"}]},{"@type":"WebSite","@id":"https:\/\/access-im-unternehmen.de\/#website","url":"https:\/\/access-im-unternehmen.de\/","name":"Access im Unternehmen","description":"Das Magazin f\u00fcr Datenbankentwickler auf Basis von Microsoft Access","publisher":{"@id":"https:\/\/access-im-unternehmen.de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/access-im-unternehmen.de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/access-im-unternehmen.de\/#organization","name":"Andr\u00e9 Minhorst Verlag","url":"https:\/\/access-im-unternehmen.de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/","url":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","contentUrl":"https:\/\/access-im-unternehmen.de\/wp-content\/uploads\/2019\/09\/aiu_wp.png","width":370,"height":111,"caption":"Andr\u00e9 Minhorst Verlag"},"image":{"@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/access-im-unternehmen.de\/#\/schema\/person\/13395c4bcd7d7963efe33be9c584d93f","name":"Andr\u00e9 Minhorst","image":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b9d010cf1716692cb9c34f21554e07d17d461acaea5b61b8cb21cbec678d48a?s=96&d=mm&r=g","caption":"Andr\u00e9 Minhorst"}}]}},"_links":{"self":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000856","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/comments?post=55000856"}],"version-history":[{"count":0,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/posts\/55000856\/revisions"}],"wp:attachment":[{"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/media?parent=55000856"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/categories?post=55000856"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/access-im-unternehmen.de\/data\/wp\/v2\/tags?post=55000856"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}