{"id":55000229,"date":"2020-08-01T00:00:00","date_gmt":"2020-11-26T14:48:44","guid":{"rendered":"http:\/\/access-im-unternehmen.aix-dev.de\/aiu\/?p=229"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-30T00:00:00","slug":"Fehlerbehandlung_unter_VBNET","status":"publish","type":"post","link":"https:\/\/vbentwickler.de\/Fehlerbehandlung_unter_VBNET\/","title":{"rendered":"Fehlerbehandlung unter VB.NET"},"content":{"rendered":"<p><b>Was w&auml;re eine Anwendung ohne Fehlerbehandlung Auch wenn wir in den bisherigen Beispielanwendungen meist gar keine Fehlerbehandlung genutzt haben, weil der Code so &uuml;bersichtlicher ist. Wenn Sie aber eine Anwendung an Kunden weitergeben, sollte diese keine unbehandelten Ausnahmen liefern. Deshalb beschreiben wir im vorliegenden Artikel, wie die Fehlerbehandlung unter VB.NET funktioniert und welche Unterschiede sich zur Fehlerbehandlung unter Access\/VBA ergeben.<\/b><\/p>\n<p><b>Beispiele ausprobieren<\/b><\/p>\n<p>Wir haben die Beispiele im Tool LINQPad eingegeben und ausprobiert. Das Tool ist in der Basisversion kostenlos und erlaubt das Ausf&uuml;hren von VB.NET-Prozeduren, ohne das Sie immer erst ein Projekt zum Debuggen starten m&uuml;ssen. Den Download des Tools finden Sie unter <b>www.linqpad.net<\/b>.<\/p>\n<p><b>Von VBA zu VB.NET<\/b><\/p>\n<p>Unter VBA war die Fehlerbehandlung recht einfach: Wir haben mit <b>On Error Resume Next <\/b>festgelegt, dass die Fehlerbehandlung f&uuml;r die folgenden Zeilen ausgesetzt wird und haben selbst mit <b>Err.Number <\/b>gepr&uuml;ft, ob ein Fehler aufgetreten ist und entsprechend darauf reagiert. Damit haben wir dann gezielt Fehler behandelt. Oder man hat zu Beginn einer Prozedur mit einer Anweisung wie <b>On Error Goto Fehler <\/b>festgelegt, dass die Prozedur im Falle eines Fehlers zu einer Marke namens <b>Fehler <\/b>springen sollte, wo wir dann eine allgemeine Fehlerbehandlung eingebaut haben, die beispielsweise eine E-Mail mit der Fehlermeldung und weiteren Informationen an den Hersteller der Software geschickt hat.<\/p>\n<p>Wenn Sie eine Anwendung von Access nach VB.NET migrieren und dabei m&ouml;glichst viel Quellcode &uuml;bernehmen wollen, gibt es allerdings eine gute Nachricht: Die unter VBA verwendeten Befehle f&uuml;r die Fehlerbehandlung funktionieren auch noch unter VB.NET.<\/p>\n<p>Das folgende klassische Beispiel liefert allerdings nicht den Beweis, dass die Fehlerbehandlung wie unter VBA funktioniert. Daf&uuml;r ben&ouml;tigen Sie allerdings einen Verweis auf den Namespace <b>Microsoft.VisualBasic<\/b>:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>DivisionByZero\r\n     On Error Resume <span style=\"color:blue;\">Next<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(1 \/ 0)\r\n     <span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (Err.Number = 0)<span style=\"color:blue;\"> Then<\/span>\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" + Err.Number + \" \" + Err.Description)\r\n     <span style=\"color:blue;\">End If<\/span>\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Das Ergebnis der Division von <b>1 <\/b>und <b>0 <\/b>wird n&auml;mlich einfach wie folgt ausgegeben:<\/p>\n<p>8<\/p>\n<p>Also l&ouml;sen wir den Fehler mit der entsprechenden .NET-Anweisung aus, n&auml;mlich <b>ThrowException<\/b>:<\/p>\n<pre>On Error Resume <span style=\"color:blue;\">Next<\/span>\r\nThrow <span style=\"color:blue;\">New<\/span> DivideByZeroException()\r\n'<span style=\"color:blue;\">Debug.Print<\/span>(1 \/ 0)\r\n<span style=\"color:blue;\">If <\/span><span style=\"color:blue;\">Not<\/span> (Err.Number = 0)<span style=\"color:blue;\"> Then<\/span>\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & Err.Number & \" \" & Err.Description)\r\n<span style=\"color:blue;\">End If<\/span><\/pre>\n<p>Damit haben wir auch gleich die erste Anweisung der Ausnahmebehandlung unter VB.NET kennengelernt &#8211; die Thow-Anweisung dient dazu, Ausnahmen auszul&ouml;sen. Mehr dazu weiter unten! &Uuml;brigens sollten Sie, auch wenn es m&ouml;glich ist, nicht mehr die von VBA gewohnten M&ouml;glichkeiten zur Fehlerbehandlung nutzen.<\/p>\n<p><b>Fehlerbehandlung unter VB.NET<\/b><\/p>\n<p>.NET bietet wesentlich umfassendere M&ouml;glichkeiten f&uuml;r die Fehlerbehandlung oder, wie man hier sagt, Ausnahmebehandlung. Die grobe Richtschnur f&uuml;r eine Fehlerbehandlung unter VB.NET ist ein Block &auml;hnlich einer <b>If&#8230;Then&#8230;Else<\/b>-Bedingung mit den drei Anweisungen <b>Try<\/b>, <b>Catch <\/b>und <b>Finally<\/b>. Die Mindestanforderung sind die beiden Anweisungen <b>Try<\/b>, <b>Catch <\/b>und die <b>End Try<\/b>-Anweisung:<\/p>\n<pre>Try\r\n     'auszuf&uuml;hrender Code, der eine Ausnahme ausl&ouml;sen k&ouml;nnte\r\nCatch ex<span style=\"color:blue;\"> As <\/span>Exception\r\n     'Code, der beim Auftreten der Ausnahme ausgef&uuml;hrt werden soll\r\nEnd Try<\/pre>\n<p>Das Pendant zu der Fehlerbehandlung von oben mit der Division durch 0 w&uuml;rde also wie folgt aussehen:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>DivisionByZeroVBNET\r\n     Try\r\n         Throw <span style=\"color:blue;\">New<\/span> DivideByZeroException()\r\n     Catch ex<span style=\"color:blue;\"> As <\/span>Exception    \r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & ex.Message)\r\n     End Try\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Der Aufbau ist also prinzipiell gar nicht so viel anders als unter VBA. Der Teil zwischen <b>Catch&#8230; <\/b>und <b>End Try <\/b>wird nur ausgef&uuml;hrt, wenn eine Ausnahme ausgel&ouml;st wird. Ein wichtiger Unterschied: Es gibt unter VB.NET kein <b>Err<\/b>-Objekt (zumindest nicht, wenn Sie <b>Try&#8230;Catch <\/b>verwenden). Daf&uuml;r legen Sie in der <b>Catch<\/b>-Anweisung jedoch ein Objekt des Typs <b>Exception <\/b>fest, hier mit der Bezeichnung <b>ex<\/b>. <b>Exception<\/b> liefert uns wie <b>Err <\/b>zwar eine Meldung, aber keine Fehlernummer.<\/p>\n<p>Wie sollen wir das nun vern&uuml;nftig auswerten und je nach Fehler entsprechend reagieren<\/p>\n<p>Ganz einfach: Es gibt f&uuml;r jede Ausnahme eine spezielle Exception. F&uuml;r diesen Fall ist diese leicht zu finden, denn die Exception wird durch das &#8220;Werfen&#8221; der Ausnahme <b>DivideByZeroException <\/b>ausgel&ouml;st. Dementsprechend k&ouml;nnen wir die <b>Catch<\/b>-Anweisung direkt etwas genauer definieren, sodass diese nur auf <b>DivideByZeroException<\/b>-Ausnahmen reagiert:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>DivisionByZeroVBNET_DivideByZeroException\r\n     Try\r\n         Throw <span style=\"color:blue;\">New<\/span> DivideByZeroException()\r\n     Catch ex<span style=\"color:blue;\"> As <\/span>DivideByZeroException\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & ex.Message & \" \")\r\n     End Try\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<p>Da Sie wissen, welcher Fehler hier behandelt wird, k&ouml;nnen Sie die Meldung auch anpassen, ohne auf <b>ex.Message <\/b>zuzugreifen:<\/p>\n<pre><span style=\"color:blue;\">Debug.Print<\/span> (\"Division durch Null.\")<\/pre>\n<p>Tritt nach der <b>Try<\/b>-Anweisung eine andere Ausnahme als <b>DivideByZeroException <\/b>auf, f&uuml;hrt dies allerdings zu einer unbehandelten Ausnahme &#8211; zum Beispiel wenn Sie mit folgender Anweisung einen Dateifehler ausl&ouml;sen:<\/p>\n<pre>Throw <span style=\"color:blue;\">New<\/span> FileNotFoundException<\/pre>\n<p>Wir sollten also auch mit der allgemeinen Ausnahme <b>Exception <\/b>alle m&ouml;glichen Ausnahmen abfangen. Dazu f&uuml;gen wir einfach einen weiteren <b>Catch<\/b>-Zweig zu dem Konstrukt hinzu:<\/p>\n<pre>Try\r\n     Throw <span style=\"color:blue;\">New<\/span> FileNotFoundException\r\n     Throw <span style=\"color:blue;\">New<\/span> DivideByZeroException()\r\nCatch ex<span style=\"color:blue;\"> As <\/span>DivideByZeroException\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Die Datei konnte nicht gefunden werden.\")\r\nCatch ex<span style=\"color:blue;\"> As <\/span>Exception\r\n     <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & ex.Message)\r\nEnd Try<\/pre>\n<p><b>Restarbeiten mit und ohne Ausnahme<\/b><\/p>\n<p>Unter VBA haben wir f&uuml;r Restarbeiten, die in jedem Fall, also auch beim Auftreten eines Fehlers zu erledigen sind, wie folgt untergebracht:<\/p>\n<pre>     On Error Resume Fehler\r\n     'Fehlerausl&ouml;sende Zeile\r\nEnde:\r\n     'Restarbeiten\r\n     <span style=\"color:blue;\">Exit Sub<\/span>\r\nFehler:\r\n     'Fehlerbehandlung\r\n     Goto Ende<\/pre>\n<p>Wir haben also unter der Marke <b>Ende <\/b>Befehle untergebracht, die auch beim Ausbleiben eines Fehlers ausgel&ouml;st werden. Damit die <b>Fehler<\/b>-Marke nur erreicht wird, wenn tats&auml;chlich ein Fehler auftritt, haben wir dieser die <b>Exit Sub<\/b>&#8211; beziehungsweise <b>Exit Function<\/b>-Anweisung vorangestellt. Damit die Aufr&auml;umarbeiten aber auch nach Auftreten eines Fehlers noch ausgef&uuml;hrt werden, haben wir am Ende der Fehlerbehandlung noch einen Verweis zur Marke <b>Ende <\/b>hinzugef&uuml;gt.<\/p>\n<p>Unter VB.NET ben&ouml;tigen wir dazu nur einen weiteren Zweig im <b>Try&#8230;End Try<\/b>-Konstukt. Dieser Zweig hei&szlig;t <b>Finally <\/b>und wird immer am Ende eingebaut:<\/p>\n<pre><span style=\"color:blue;\">Sub <\/span>TryCatchFinally\r\n     Try\r\n         Throw <span style=\"color:blue;\">New<\/span> FileNotFoundException\r\n         Throw <span style=\"color:blue;\">New<\/span> DivideByZeroException()\r\n     Catch ex<span style=\"color:blue;\"> As <\/span>DivideByZeroException\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & ex.Message)\r\n     Catch ex<span style=\"color:blue;\"> As <\/span>Exception\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Fehler: \" & ex.Message)\r\n     Finally\r\n         <span style=\"color:blue;\">Debug.Print<\/span>(\"Restarbeiten\")\r\n     End Try\r\n<span style=\"color:blue;\">End Sub<\/span><\/pre>\n<div class=\"rcp_restricted\"><p><span style=\"color: #ff0000;\">M&ouml;chten Sie weiterlesen? Dann l&ouml;sen Sie Ihr Ticket!<\/span><br \/>\n<span style=\"color: #ff0000;\">Hier geht es zur Bestellung des Jahresabonnements des Magazins <strong>Visual Basic Entwickler<\/strong>:<\/span><br \/>\n<span style=\"color: #ff0000;\"><a style=\"color: #ff0000;\" href=\"https:\/\/shop.minhorst.com\/magazine\/363\/visual-basic-entwickler-jahresabonnement?c=77\">Zur Bestellung ...<\/a><\/span><br \/>\n<span style=\"color: #ff0000;\">Danach greifen Sie sofort auf <strong>alle rund 200 Artikel<\/strong> unseres Angebots zu - auch auf diesen hier!<\/span><br \/>\n<span style=\"color: #000000;\">Oder haben Sie bereits Zugangsdaten? Dann loggen Sie sich gleich hier ein:<\/span><\/p>\n<\/div>\n\n\t\n\t<form id=\"rcp_login_form\"  class=\"rcp_form\" method=\"POST\" action=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000229\/\">\n\n\t\t\n\t\t<fieldset class=\"rcp_login_data\">\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_login\">Username or Email<\/label>\n\t\t\t\t<input name=\"rcp_user_login\" id=\"rcp_user_login\" class=\"required\" type=\"text\"\/>\n\t\t\t<\/p>\n\t\t\t<p>\n\t\t\t\t<label for=\"rcp_user_pass\">Password<\/label>\n\t\t\t\t<input name=\"rcp_user_pass\" id=\"rcp_user_pass\" class=\"required\" type=\"password\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t\t<p>\n\t\t\t\t<input type=\"checkbox\" name=\"rcp_user_remember\" id=\"rcp_user_remember\" value=\"1\"\/>\n\t\t\t\t<label for=\"rcp_user_remember\">Remember me<\/label>\n\t\t\t<\/p>\n\t\t\t<p class=\"rcp_lost_password\"><a href=\"\/data\/wp\/v2\/posts\/55000229?rcp_action=lostpassword\"><\/a><\/p>\n\t\t\t<p>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_action\" value=\"login\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_redirect\" value=\"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000229\/\"\/>\n\t\t\t\t<input type=\"hidden\" name=\"rcp_login_nonce\" value=\"0c38ab74e4\"\/>\n\t\t\t\t<input id=\"rcp_login_submit\" class=\"rcp-button\" type=\"submit\" value=\"Login\"\/>\n\t\t\t<\/p>\n\t\t\t\t\t<\/fieldset>\n\n\t\t\n\t<\/form>\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Was w&auml;re eine Anwendung ohne Fehlerbehandlung Auch wenn wir in den bisherigen Beispielanwendungen meist gar keine Fehlerbehandlung genutzt haben, weil der Code so &uuml;bersichtlicher ist &#8211; wenn Sie eine Anwendung an Kunden weitergeben, sollte diese keine unbehandelten Ausnahmen liefern. Deshalb beschreiben wir im vorliegenden Artikel, wie die Fehlerbehandlung unter VB.NET funktioniert und welche Unterschiede sich zur Fehlerbehandlung unter Access\/VBA ergeben.<\/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":[662020,66042020,44000016,44000017],"tags":[],"yst_prominent_words":[],"class_list":["post-55000229","post","type-post","status-publish","format-standard","hentry","category-662020","category-66042020","category-VBGrundlagen","category-WebApps_Razor_Pages"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000229","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/comments?post=55000229"}],"version-history":[{"count":0,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/posts\/55000229\/revisions"}],"wp:attachment":[{"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/media?parent=55000229"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/categories?post=55000229"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/tags?post=55000229"},{"taxonomy":"yst_prominent_words","embeddable":true,"href":"https:\/\/vbentwickler.de\/data\/wp\/v2\/yst_prominent_words?post=55000229"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}