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

Exception Handling in Visual Basic.NET

Geschrieben von: Christian Holm
Kategorie: VB.NET

This printed page brought to you by AlphaSierraPapa

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:

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:

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.

This printed page brought to you by AlphaSierraPapa

Download des Codes

Klicken Sie hier, um den Download zu starten.
http://www.aspheute.com/code/20001024.zip

Verwandte Artikel

Exception Handling in C#
http:/www.aspheute.com/artikel/20000724.htm
Regex'en zu Assemblies kompilieren
http:/www.aspheute.com/artikel/20020902.htm

 

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