3.3 Laufzeitfehler und Exception Handling
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«
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. In Abbildung 3.3 ist der Fehler zu sehen, in der der Fehler auftritt.
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).
Gibt der Benutzer eine der beiden Zahlen gar nicht ein, so tritt eine unbehandelte Ausnahme des Typs InvalidCastException auf. In Abbildung 3.4 ist wiederum der Fehler zu sehen, in der der Fehler auftritt.
Abbildung 3.4 InvalidCastException in der markierten Zeile
Die leere Zeichenkette im Eingabefeld konnte nicht in eine Zahl vom Typ Integer umgewandelt werden.
Nach der Anzeige einer unbehandelten Ausnahme muss das Programm mithilfe des Menüpunkts 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:
- Das Schlüsselwort Try leitet das Exception Handling ein. Ab diesem Punkt versucht das Programm, einen Anweisungsblock auszuführen.
- 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
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.
- 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.
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.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.