3.3 Laufzeitfehler und Exception Handling 

Ausnahmen
Das Exception Handling dient zum Abfangen von Laufzeitfehlern und zum Behandeln von Ausnahmen. Diese treten auf, wenn das Programm versucht, eine unzulässige Operation durchzuführen, beispielsweise eine Division durch Null oder das Öffnen einer nicht vorhandenen Datei.
Es ist natürlich besser, Laufzeitfehler von Anfang an zu unterbinden. Dies ist allerdings unmöglich, da es Vorgänge gibt, auf die Sie als Programm-Entwickler keinen Einfluss haben, etwa die fehlerhafte Eingabe eines Benutzers oder ein beim Druckvorgang ausgeschalteter Drucker.
3.3.1 Programm mit Laufzeitfehlern 

Im nachfolgenden Beispiel im Projekt Laufzeitfehler werden verschiedene Arten von Exceptions hervorgerufen und mit dem Exception Handling von Visual Basic behandelt.
Der Benutzer soll zwei Zahlen eingeben. Nach Betätigung des Buttons Rechnen wird die erste Zahl durch die zweite geteilt und das Ergebnis der Division in einem Label ausgegeben.
Public Class Form1 Private Sub cmdRechnen_Click(...) Handles ... Dim x, y, z As Integer x = txtEingabe1.Text y = txtEingabe2.Text z = x / y lblAusgabe.Text = z End Sub End Class
Listing 3.1 Projekt »Laufzeitfehler«
OverFlowException
Gibt der Benutzer die Zahlen 12 und 3 ein, erscheint als Ergebnis erwartungsgemäß die Zahl 4, siehe Abbildung 3.2.
Abbildung 3.2 Eingabe korrekter Zahlen
Wenn er dagegen die Zahlen 12 und 0 eingibt, dann tritt eine unbehandelte Ausnahme des Typs OverFlowException auf, siehe Abbildung 3.3.
Abbildung 3.3 OverFlowException in der markierten Zeile
Die Division einer Zahl durch 0 ergibt unendlich. Dieser Wert liegt außerhalb des Zahlenbereichs des Datentyps Integer, daher wurde der Zahlenbereich überschritten (Overflow).
InvalidCastException
Gibt der Benutzer eine der beiden Zahlen gar nicht ein, so tritt eine unbehandelte Ausnahme des Typs InvalidCastException auf, siehe Abbildung 3.4.
Abbildung 3.4 InvalidCastException in der markierten Zeile
Die leere Zeichenkette im Eingabefeld konnte nicht in eine Zahl vom Typ Integer umgewandelt werden.
Debuggen beenden
Nach der Anzeige einer unbehandelten Ausnahme muss das Programm mithilfe des Menüpunkt Debuggen • Debugging beenden beendet werden, bevor es erneut gestartet werden kann.
3.3.2 Einfaches Exception Handling 

Es folgt im Projekt ExceptionHandling eine verbesserte Version des Projekts Laufzeitfehler.
Public Class Form1 Private Sub cmdRechnen_Click(...) Handles ... Dim x, y, z As Integer Try x = txtEingabe1.Text y = txtEingabe2.Text z = x / y lblAusgabe.Text = z Catch ex As Exception lblAusgabe.Text = "Fehler: " & ex.Message End Try End Sub End Class
Listing 3.2 Projekt »ExceptionHandling«
Zur Erläuterung:
Try
- Das Schlüsselwort Try leitet das Exception Handling ein. Ab diesem Punkt versucht das Programm, einen Anweisungsblock auszuführen.
Catch
- Tritt während der nachfolgenden Anweisungen eine Exception auf, so wird sie mithilfe von Catch abgefangen: Das Programm wechselt sofort bei Auftreten der Exception in einen Catch-Block und führt die dort angegebenen Anweisungen aus.
- Im Catch-Block steht ein Objekt der Klasse Exception zur Verfügung, hier ist dies ex. Dieses Objekt beinhaltet weitere Informationen zu dem Fehler, unter anderem die Fehlermeldung in der Eigenschaft Message. Diese Fehlermeldung wird im vorliegenden Fall ausgegeben.
Falls der Benutzer die Zahlen 12 und 3 eingibt, erscheint nach wie vor die Zahl 4. Im Try-Block ist keine Exception aufgetreten. Bei Eingabe der Zahlen 12 und 0 erscheint eine Fehlermeldung im Label, siehe Abbildung 3.5.
Abbildung 3.5 Überlauf abgefangen
Gibt der Benutzer eine der beiden Zahlen gar nicht ein, so erscheint die andere Fehlermeldung im Label, siehe Abbildung 3.6.
Abbildung 3.6 Umwandlungsfehler abgefangen
Anders als in der ersten Version kann das Programm trotz der Fehlermeldungen weiterlaufen.
3.3.3 Erweitertes Exception Handling 

Exception-Klassen
Die Klasse Exception ist die Basis mehrerer Exception-Klassen. Dies bedeutet, dass ein Fehler wesentlich spezifischer abgefangen und behandelt werden kann. Eine weitere Verbesserung des Programms folgt im Projekt ExceptionHandlingErweitert:
Public Class Form1 Private Sub cmdRechnen_Click(...) Handles ... Dim x, y, z As Integer Try x = txtEingabe1.Text y = txtEingabe2.Text z = x / y lblAusgabe.Text = z Catch ex As InvalidCastException lblAusgabe.Text = "Fehler: Konvertierung" Catch ex As OverflowException lblAusgabe.Text = "Fehler: Überlauf" Catch ex As Exception lblAusgabe.Text = "Fehler: allgem. Exception" End Try End Sub End Class
Listing 3.3 Projekt »ExceptionHandlingErweitert«
Zur Erläuterung:
- Es gibt nunmehr drei Catch-Blöcke, die in der Lage sind, drei verschiedene Fehler durch unterschiedliche Anweisungen zu behandeln.
- Im ersten Catch-Block wird der Konvertierungsfehler mit Unterstützung eines Objekts der Klasse InvalidCastException abgefangen.
- Im zweiten Catch-Block wird der Überlauf-Fehler mit Unterstützung eines Objekts der Klasse OverFlowException abgefangen.
Klasse Exception
- Im dritten Catch-Block werden alle nicht spezifisch abgefangenen Fehler mit Unterstützung eines Objekts der allgemeinen Klasse Exception behandelt.
Die Reihenfolge der Catch-Blöcke ist wichtig, da die Blöcke bei Auftreten eines Fehlers der Reihe nach durchlaufen werden. Der erste zutreffende Catch-Block wird genutzt. Hätten Sie also den dritten Block mit der allgemeinen Klasse Exception nach vorne gesetzt, so wäre in jedem Fehlerfall die Meldung Fehler: allgemeine Exception erschienen.
IntelliSense
Die Entwicklerunterstützung IntelliSense bemerkt und markiert eine falsche Reihenfolge der Catch-Blöcke aber bereits zur Entwicklungszeit und ermöglicht so die rechtzeitige Korrektur.