Exception Handling in Visual Basic.NET
Geschrieben von: Christian Holm Auch bei der Webseiten-Programmierung ist die Fehlerbehandlung ein wichtiges Thema. Diese erspart dem Client frustrierende Browsermeldungen, Scriptabstürze und Sie können davon ausgehen, daß Sie nur korrekte Werte vom Client übermittelt bekommen. Das Problem bei ASP Seiten war und ist, daß VBScript eine Fehlerbehandlung bietet, die jenseits von Gut und Böse liegt. Während also ASP-Programmierer mit On Error Resume Next und Err.Number verzweifelten, konnten C++ Programmier komfortabel mit try-catch-finally arbeiten. Voraussetzung um den Sourcecode dieses Artikels verwenden zu können ist eine Installation des Microsoft .NET Framework SDK's auf einem Webserver. Weiters setze ich voraus, daß der Leser den Umgang mit Visual Basic zu einem gewissen Grad beherrscht. Exception HandlingMit der Microsoft .NET Common Language Runtime wird nun vieles einfacher - nicht nur für C++/C# Programmierer! Denn in ASP.NET können Sie endlich Gebrauch von richtigen Programmiersprachen machen und die Grenzen von Scriptsprachen mit Leichtigkeit überflügeln. Hinzu kommt, daß das Microsoft .NET Framework endlich - abgesehen von sprachtypischen Syntax-Konventionen - ein einheitliches Fehlermanagement bietet: nämlich die Exceptions. Exceptions, was soviel wie Ausnahmen bedeutet, können von einer Komponente ausgelöst werden und im aufrufenden Programm elegant abgefangen werden. Das .NET Framework stellt standardmäßig eine Vielzahl von möglichen Exceptions zur Verfügung. Ausgehend vom Grundausnahmefehler, der einfachen Exception, leiten sich für die häufigsten Fehler spezifische Exceptions ab. Eine kleine Auswahl:
Nun wollen Sie aber keine der komplexeren Programmiersprachen wie C++ oder C# lernen. Kein Problem - Sie können in ASP.NET ohne Probleme Visual Basic verwenden. Visual Basic ist um einiges leistungsfähiger als VBScript, bietet mehr Möglichkeiten und ein Umstieg stellt keinen allzu großen Aufwand dar. Zusätzlich stellt VB.NET Fehlerbehandlungsroutinen zur Verfügung, die denen von C++ bzw. C# in nichts nachstehen - aber den Komfort von Visual Basic bieten. In den nun folgenden Beispielen demostriere ich Ihnen wie einfach das Exception Handling in VB.NET zu implementieren ist. Durch die einheitliche Verankerung im .NET Framework müssen Sie, wie schon erwähnt, im Vergleich zu C# keine Abstriche machen. Sie können wie in C# Exceptions abfangen, selbst werfen, oder eine selbst kreierte Fehlermeldung ausgeben. Natürlich können Sie auch Gebrauch vom Finally Statement machen, welches Statements auch nach Exceptions ausführt. Realisierung in VB.NETVB.NET ist in manchen Situationen (z.B cast Operationen) um einiges gutmütiger als zum Beispiel C# - Datentypen werden je nach Gebrauch teilweise auch implizit konvertiert. C# würde Ihnen da schon längst auf die Finger klopfen und Sie zu einer expliziten Umcastung auffordern. Deshalb wollen wir uns in diesem Artikel mit Fehlern beschäftigen, die VB.NET nicht so leicht verzeiht. Nehmen wir zum Beispiel an, wir deklarieren ein Array mit 4 Elementen. Aus irgendeinem Grund passiert es aber, daß unsere for Schleife 5 Elemente auslesen will. Dies ist nun auch für VB ein guter Grund eine Exception auszugeben. Der Sourcode hierfür ist folgender: <%@ Page Language=VB %> <% Dim arTest() As Integer = {0, 1, 2, 3} Dim nVar As Integer For nVar = 0 To 5 Step 1 Response.Write(arTest(nVar)) Next %> Bei Aufruf dieses Sourcecodes erhalten wir eine IndexOutOfRange Exception. Dies sieht dann ungefähr so im Browser aus: Nun gibt es mehrere Möglichkeiten um eine geworfene Exception zu behandeln bzw. anzufangen: Die Try-Catch MethodeDiese ist die einfachste Möglichkeit um einer abrupte Beendigung der Sourcecodeausführung zu entgehen. Der Try ... End Try Block enthält nicht nur den Sourcecode, der möglicherweise zu einer Exception führen könnte, sondern auch die Fehlerbehandlung mittels Catch Statement. Wie eingangs erwähnt, geschieht prinzipiell das Gleiche wie in C# - der Unterschied liegt nur im Syntax. Der vorige Sourecode bekommt nun eine wesentliche Verbesserung. Den Sourcecode für dieses Beispiel finden Sie im Sourcecode Download in der Datei ArrayExceptionCatched.aspx. <%@ Page Language=VB %> <% Dim arTest() As Integer = {0, 1, 2, 3} Dim nVar As Integer Try For nVar = 0 To 5 Step 1 Response.Write(arTest(nVar)) Next Catch e As Exception Response.Write(e.toString) End Try %> Das Catch Statement fängt die allgemeine Exception "e" ab und gibt diese wiederum im Browser Fenster aus. Man erhält also: Der Sourcecode wird bis zum Auftreten der Exception ausgeführt. Dies erkennt man daran, daß der Inhalt des Arrays arTest bis zum letztgültigen Indexer ausgegeben wird (Stelle am Anfang: 0123). Die Exception ist zwar jetzt elegant abgefangen, aber das war's auch schon. Code, der nach dem aufgetretenen Fehler folgt, wird nicht mehr ausgeführt (innerhalb Try-End Try). Damit zeigt sich schon die Notwendigkeit nach einem ausgereifteren Prozeß. Damit wären wir auch schon bei der nächsten Methode:Die Try-Catch-Finally MethodeFür den Fall, daß es ein "Leben" nach der Exception geben soll, d.h. daß etwaiger Sourcecode nach einer möglichen Exception ausgeführt werden soll, bietet sich zusätzlich das Finally Statement an. Wiederum angewandt an unserem Array Beispiel (ArrayExceptionCatchedFinally.aspx): <%@ Page Language=VB %> <% Dim arTest() As Integer = {0, 1, 2, 3} Dim nVar As Integer Try For nVar = 0 To 5 Step 1 Response.Write(arTest(nVar)) Next Catch e As Exception Response.Write(e.toString) Finally Response.Write("<br><br>Diese Statements werden trotz Exception ausgeführt") End Try %> Wie gesagt wird nach der aufgetretenen Exception das Response.Write Statement ausgeführt und seine Meldung im Browserfenster sichtbar: Der Code in Finally wird immer ausgeführt - ob der Code eine Exception ausgelöst hat oder nicht. Deshalb bietet sich der Finally Block für "Cleanup" an: um Resourcen freizugeben.Mehrere ExceptionsWie in C++ bzw. in C# können Sie natürlich auch mehrere Exceptions abfangen. Schachteln Sie einfach die Catch Statements innerhalb des Try ... End Try Blockes - That's it!. Bei der Anwendung von mehreren Catch Statements kann in manchen Fällen schon eine Exception ausreichen, um das Ergebnis oder die weitere Abarbeitung des Sourcecodes sinnlos zu machen. Um eben den Try ... End Try Block sofort nach der Exception zu verlassen verwenden Sie Exit Try nach dem Catch Statement. Benutzerdefinierte FehlermeldungenDie Fehlermeldungen, die Sie nach dem Abfangen einer Exception erhalten sind nicht für jeden "lesbar". Um den Client präzise und leicht verständlich auf seinen Fehler aufmerksam zu machen, können Sie Ihre eigenen Fehlermeldungen im Browser ausgeben (CustomExceptionMsg.aspx): <%@ Page Language=VB %> <% Dim nVar As Integer Try nVar="Test" Response.Write(nVar) Catch e As InvalidCastException 'benutzerdefinierte Fehlermeldung Response.Write("<b>Fehler aufgetreten!</b><br>") 'Standard-Fehlermeldung Response.Write(e.toString) End Try %> Die Gegenüberstellung zwischen benutzerdefiniert und Standard zeigt der nächste Screenshot: Natürlich sollte man nicht nur die Meldung "Fehler aufgetreten!" ausgeben - aber hier lag die Würze in der Kürze. Throwing ExceptionsAls Abschluß möchte ich Ihnen noch demonstrieren, daß Sie nicht nur Exceptions abfangen können, sondern auch selbst "werfen" (throw) können. Das "Werfen" von Exceptions ist genauso einfach wie das Abfangen. Sie deklarieren die Exception und verwenden dann dort wo Sie "geworfen" werden soll das Throw Statement (ThrowArgExc.aspx): <%@ Page Language=VB %> <% Dim nVar As Integer Dim ArgEx As New ArgumentException nVar = 10 if nVar > 5 Then Throw ArgEx Else Response.Write("Alles OK") End If %> Bei der Deklaration der Exception (Dim ArgEx ...) ist das Keyword New unbedingt anzuführen, da sonst Komplikationen auftreten können. Selbstverständlich können Sie Ihre eigens geworfenen Exceptions auch mit den üblichen Mitteln wieder abfangen (ThrowNCatchEx.aspx): <%@ Page Language=VB %> <% Dim nVar As Integer Dim AEx As New ArgumentException Try nVar ="10" if nVar > 5 Then Throw AEx Else Response.Write("Alles OK") End If Catch e As Exception Response.Write(e.toString) End Try %> Tips zur Verwendung von Exceptions:Um ein sinnvolles Exception Handling zu gewährleisten, sollten Sie:
SchlußbemerkungSie sind nun in der Lage auch in VB.NET effizientes Exception Handling einzusetzen. Sie wissen nun wie Exceptions zustandekommen können, wie man Sie "abfängt" oder wie man nachfolgenden Code trotzdem ausführt. Sie können dem Client nun leicht verständliche Fehlermeldungen präsentieren oder Exceptions selbst werfen. Da das Microsoft .NET Framework ein einheitliches Exception Handling aufweist, und somit VB.NET ähnliche Fähigkeiten wie C# in Bezug auf das Exception Handling hat, können Sie schnell und ohne großen Aufwand professionelle Webseiten mit einer effizienten Fehlerbehandlung erstellen. Download des CodesKlicken Sie hier, um den Download zu starten. Verwandte Artikel
Exception Handling in C# Wenn Sie jetzt Fragen haben...Wenn Sie Fragen rund um die in diesem Artikel vorgestellte Technologie haben, dann schauen Sie einfach bei uns in den Community Foren der deutschen .NET Community vorbei. Die Teilnehmer helfen Ihnen gerne, wenn Sie sich zur im Artikel vorgestellten Technologie weiterbilden möchten. Eine weitere sehr hilfreiche Resource ist das deutsche ASP.NET Wiki, das als zentrale Anlaufstelle für Tips, Tricks, Know How und alles Nützliche was man in seinem Alltag als (ASP).NET-Entwickler so braucht und entdeckt gedacht ist. Haben Sie Fragen die sich direkt auf den Inhalt des Artikels beziehen, dann schreiben Sie dem Autor! Unsere Autoren freuen sich über Feedback zu ihren Artikeln. Ein einfacher Klick auf die Autor kontaktieren Schaltfläche (weiter unten) und schon haben Sie ein für diesen Artikel personalisiertes Anfrageformular.
Und zu guter Letzt möchten wir Sie bitten, den Artikel zu bewerten. Damit helfen Sie uns, die Qualität der Artikel zu verbessern - und anderen Lesern bei der Auswahl der Artikel, die sie lesen sollten.
©2000-2006 AspHeute.com |