Glengamoi (Forum) · AspHeute · .NET Heute (RSS-Suche) · AspxFiles (Wiki) · .NET Blogs
ASP German Homepage Homepage
 

Liste

.NET 2.0 (1)
.NET Allgemein (16)
.NET Fu (5)
ADO.NET (11)
Aprilscherz (3)
ASP Grundlagen (44)
ASP Tricks (83)
ASP.NET (44)
ASPIntranet.de (5)
C# (28)
Datenbank (44)
Dokumentation (4)
IIS 6.0 (1)
Komponenten (29)
Optimierung (10)
Server (21)
Sicherheit (34)
Tee Off (6)
VB.NET (6)
WAP (8)
Web Services (11)
XML (9)

RSS 2.0 - Die neuesten fünf Artikel auf AspHeute.com


 

Suchen





 

English Articles
Chinese Articles
Unsere Autoren
 
Link zu AspHeute
Impressum
Werben
Anfragen

Exception Handling in Visual Basic.NET

Geschrieben von: Christian Holm
Kategorie: VB.NET

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 Handling

Mit 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:

  • SystemException: für Fehler während der Laufzeit
  • IndexOutOfRangeException: wenn der Index eines Arrays außerhalb des gültigen Bereichs ist
  • FormatException: wenn einer Variable ein Wert mit nicht dazupassendem Datentyp zugewiesen wird
  • ArgumentException: allgemeiner Wertzuweisungsfehler

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

VB.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 Methode

Diese 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 Methode

Fü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 Exceptions

Wie 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 Fehlermeldungen

Die 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 Exceptions

Als 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:

  • lieber Exceptions genau spezifieren, als nur eine allgemeine Exception werfen
  • wenn ungültige Werte übergeben werden immer die ArgumentException werfen
  • Für Exceptions, die vom Client ausgelöst werden einen verständlichen Text ausgeben
  • auf das Werfen von Exceptions verzichten wenn der sichere und vollständige Programmablauf gefährdet ist
  • auf Exceptions verzichten, wenn triviale Fehler behandelt werden sollen

Schlußbemerkung

Sie 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 Codes

Klicken Sie hier, um den Download zu starten.

Verwandte Artikel

Exception Handling in C#
Regex'en zu Assemblies kompilieren

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.

Bewerten Sie diesen Artikel
 Sehr gut   Nicht genügend  
   1  2  3  4  5  
 

  
   Für Ausdruck optimierte Seite

©2000-2006 AspHeute.com
Alle Rechte vorbehalten. Der Inhalt dieser Seiten ist urheberrechtlich geschützt.
Eine Übernahme von Texten (auch nur auszugsweise) oder Graphiken bedarf unserer schriftlichen Zustimmung.