Heute Zeige ich euch etwas über die Fehlerbehandlung, und wie ihr eure Fehler "ausbügelt"
Fehlerbehandlung
.:Index:.
-1.Fehlerarten
-2.Syntaxfehler und IntelliSense
-3.Laufzeitzfehler und Exception Handlng
-3.1.Programm mit Laufzeitfehlern
-3.2.Einfaches Exception Handling
-3.3.Profi Exception Handling
-4.Logische Feler und Debugging
-4.1.Einzelschrittverfahren
-4.2.Haltpunkte
-4.3.Aufnahmefenster
1.Fehlerarten
Während man ein Programm entwickelt und testet, treten normalerweise noch häufig Fehler auf. Diese Fehler lassen sich in drei Gruppen untergliedern: Syntaxfehler, Laufzeitfehler und logische Fehler.
Syntaxfehler können mithilfe des Editors und der Entwicklerunterstützung IntelliSense vermieden werden. Laufzeitfehler, also Fehler zur Laufzeit des Programms, die einen Programmabsturz zur Folge haben, gibt es streng genommen in Visual Basic nicht mehr. Stattdessen werden Ausnahmen (Exceptions) erzeugt, die mit einer Ausnahmebehandlung (Exception Handling) umgangen werden müssen. Logische Fehler sind erfahrungsgemäß am schwersten zu finden. Hier bietet das Debugging eine gute Hilfestellung.
2.Syntaxfehler und IntelliSense
3.2 Syntaxfehler und IntelliSense
Fehler wird markiert
Syntaxfehler treten zur Entwicklungszeit des Programms auf und haben ihre Ursache in falsch oder unvollständig geschriebenem Programmcode. Bereits beim Schreiben des Codes wird man von Visual Basic auf Syntaxfehler aufmerksam gemacht. Ein nicht korrekt geschriebenes Schlüsselwort, ein Block If ohne End If oder andere Fehler werden sofort erkannt und markiert.
Der Programmierer erhält eine Warnmeldung, häufig wird eine Information mit Hilfestellung zur Fehlerkorrektur angeboten. Manchmal wird die Fehlerkorrektur sogar schon automatisch ausgeführt. Wird der Fehler nicht behoben, so wird eine Übersetzung und Ausführung des Programms abgelehnt.
IntelliSense
Die Entwicklerunterstützung IntelliSense trägt in hohem Maße dazu bei, solche Syntaxfehler erst gar nicht auftreten zu lassen. Während des Schreibens einer Anweisung werden zahlreiche Hilfestellungen angeboten.
Einige Beispiele:
Sobald man den Punkt hinter den Namen eines Objekts, z. B. eines Steuerelements, gesetzt hat, erscheinen die Eigenschaften und Methoden dieses Elements zur Auswahl.
Hilfsliste
Beginnt man, einen beliebigen Namen zu schreiben, so wird sofort eine Hilfsliste mit Anweisungen oder Objekten angeboten, die im Zusammenhang mit der aktuellen Anwendung stehen und die gleichen Anfangsbuchstaben haben.
Zu dem aktuell verwendeten Programmierelement (Klasse, Objekt, Eigenschaft, Methode usw.) wird ein QuickInfo eingeblendet, das den Entwickler über die Einsatzmöglichkeiten des jeweiligen Elements informiert.
Hat man sich einmal an dieses Verhalten gewöhnt, bietet IntelliSense eine wertvolle Hilfe zur Codierung und Fehlervermeidung.
Syntaxfehler und IntelliSense sollen mithilfe des nachfolgenden Programms p0301 verdeutlicht werden. Das Programm soll eigentlich zur Überprüfung dienen, ob eine eingegebene Zahl positiv, negativ oder gleich 0 ist.
In den Programmcode wurde allerdings eine Reihe von typischen Fehlern eingebaut. Diese werden bereits während der Codierung durch blaue Wellenlinien und rote Kästen kenntlich gemacht.
Zur Erläuterung:
In der Zeile If txtEingabe.Txt == "" Then verbergen sich zwei Fehler. Die Eigenschaft Text der TextBox und der Vergleichsoperator = wurden falsch geschrieben.
Falls die TextBox leer ist, soll die Prozedur sofort verlassen werden. Die Anweisung Exit Sub wurde ebenfalls falsch geschrieben.
Die Funktion zur Wertermittlung heißt korrekt Val() und nicht Value().
Das Then in der gleichen Zeile und das Else zwei Zeilen tiefer werden angemerkt, weil der If-Block zwei Else-Zweige hat. In der Zeile mit Value() müsste folglich ein ElseIf stehen.
In der Zeile vor dem End If wird der Text »gleich 0« markiert, da er einem Objekt (lblAnzeige) und nicht der Eigenschaft des Objekts (Text) zugewiesen werden soll.
Einige Fehler wurden während der Codierung bereits automatisch behoben und sind im obigen Bild gar nicht mehr zu sehen:
Am Ende einer Zeile, die mit If beginnt, wurde beim Zeilenwechsel das Then eingefügt.
Am Ende einer Zeile, die mit einer Zeichenkette endet, wurde beim Zeilenwechsel der zunächst fehlende Anführungsstrich ergänzt.
3.Laufzeitzfehler 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 an Anfang an zu unterbinden. Dies ist allerdings unmöglich, da es Vorgänge gibt, auf die der Programm-Entwickler keinen Einfluss hat, etwa die fehlerhafte Eingabe eines Benutzers oder ein beim Druckvorgang ausgeschalteter Drucker.
3.1.Programm mit Laufzeitfehlern
Im nachfolgenden Beispiel p0302 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.
Code:
Public Class frm0302
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
Gibt der Benutzer die Zahlen 12 und 3 ein, erscheint als Ergebnis erwartungsgemäß die Zahl 4. Wenn er dagegen die Zahlen 12 und 0 eingibt, dann tritt eine unbehandelte Ausnahme des Typs »OverFlowException« auf.
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.
Die leere Zeichenkette im Eingabefeld konnte nicht in eine Zahl vom Typ Integer umgewandelt werden. Dieser Fehler könnte natürlich durch Einsatz der Funktion Val() umgangen werden, er soll aber zu Demonstrationszwecken erhalten bleiben.
3.2.Einfaches Exception Handling
Das Programm p0302 wird nun zur Behandlung der Exceptions wie folgt verbessert:
Code:
Public Class frm0302
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
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 die folgende Fehlermeldung im Label: Fehler : Die Operation hat einen Überlauf verursacht
Gibt der Benutzer eine der beiden Zahlen gar nicht ein, so erscheint die andere Fehlermeldung im Label: Fehler : Falsche Konvertierung , die Zahl konnte nicht in den Type Integer konvertieren!
Anders als in der ersten Version kann das Programm trotz der Fehlermeldungen weiterlaufen.
3.3.Profi 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. Das Programm p0302 erfährt im Folgenden eine weitere Verbesserung:
Code:
Public Class frm0302
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
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ätte man 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.
4.Logische Feler und Debugging
Logische Fehler treten auf, wenn eine Anwendung zwar ohne Syntaxfehler übersetzt und ohne Laufzeitfehler ausgeführt wird, aber nicht das geplante Ergebnis liefert. Dies liegt daran, dass die Programmlogik falsch aufgebaut wurde.
Debugging
Die Ursache logischer Fehler zu finden, ist oft schwierig und kann nur durch intensives Testen und Analysieren der Abläufe und Ergebnisse durchgeführt werden. Visual Basic stellt im Zusammenhang mit dem Debugging einige wertvolle Hilfen zur Verfügung.
4.1.Einzelschrittverfahren
Taste F8
Man kann ein Programm im Einzelschrittverfahren ablaufen lassen, um sich dann bei jedem einzelnen Schritt die aktuellen Inhalte von Variablen und Steuerelementen anzuschauen. Dabei beginnt man mit dem Menüpunkt Debuggen • Einzelschritt (Funktionstaste
).Als Beispiel dient wiederum das Programm p0302 zur Division zweier Zahlen (in seiner ursprünglichen, fehlerhaften Form). Nach dem Start des Einzelschrittverfahrens startet die Anwendung zunächst »normal« und man kann zwei Zahlen (hier 12 und 3) eingeben.
Markierte Zeile
Beim Betätigen des Buttons wird nun allerdings die Ereignisprozedur angezeigt: Ein gelber Pfeil vor einer gelb markierten Zeile kennzeichnet den Punkt, an dem das Programm gerade angehalten wurde und auf die Reaktion des Entwicklers wartet.
Nach zwei weiteren Einzelschritten (Funktionstaste
) steht das Programm auf der Zeile y = txtEingabe2.Text.Wert anzeigen
Platziert man den Cursor über einer Variablen oder einer Steuerelement-Eigenschaft (z. B. über der Variablen x), so sieht man den aktuellen Wert (hier der Wert 12 für x). Man kann auch erkennen, dass die Variable y noch den Wert 0 hat, da die aktuell markierte Anweisung noch nicht ausgeführt wurde. Bereits nach dem nächsten Einzelschritt hat die Variable y den Wert 3. Nach Durchführung aller Einzelschritte erscheint das Ergebnis des Programms wie gewohnt in der Anwendung.
Dieses einfache Beispiel zeigt, dass man mit dem Einzelschrittverfahren bereits den Ablauf eines Programms stückweise verfolgen kann und so den Ursprung eines logischen Fehlers leichter lokalisieren kann.
4.2.Haltepunkte
Dauert das Einzelschrittverfahren bei einem bestimmten Programm zu lange, kann man auch mit Haltepunkten (Breakpoints) arbeiten. Das Programm durchläuft dann alle Anweisungen bis zu einem solchen Haltepunkt. Man setzt einen Haltepunkt in die Nähe der Stelle, an der man den Ursprung eines Fehlers vermutet.
Taste F9
Das Setzen eines Haltepunkts geschieht mithilfe des Menüpunkts Debuggen • Haltepunkt setzen (Funktionstaste
). Es wird ein Haltepunkt in der Zeile gesetzt, in der sich der Cursor befindet. Im Beispiel bietet sich hierfür die Zeile an, in der z = x / y berechnet wird.Das Programm wird nun über die Funktionstaste
gestartet. Es unterbricht vor der Ausführung der Zeile mit dem Haltepunkt. Ab diesem Punkt kann man das Programm wiederum im Einzelschrittverfahren ablaufen lassen und die Werte der Variablen wie oben beschrieben kontrollieren.Es können auch mehrere Haltepunkte gesetzt werden. Ein Haltepunkt wird wieder entfernt, indem man den Cursor in die betreffende Zeile setzt und wiederum die Funktionstaste
betätigt. Über das Menü Debuggen können auch alle Haltepunkte auf einmal entfernt werden.Darüber hinaus gibt es die Möglichkeit, alle Haltepunkte zu deaktivieren. Dies ist sehr nützlich, wenn man die Haltepunkte bei einer späteren Fehlersuche gegebenenfalls wieder aktivieren möchte.
4.3.Aufnahmefenster
Das Überwachungsfenster bietet während des Debuggens eine weitere komfortable Möglichkeit der Variablenkontrolle. Es kann während des Debuggens über den Menüpunkt Debuggen • Fenster • Überwachen eingeblendet werden.
Werte anzeigen
Es bietet die Möglichkeit, die Namen von Variablen oder von Steuerelement-Eigenschaften in der Spalte Name einzugeben. In der Spalte Wert erscheint dann jeweils der aktuelle Wert beim Ablauf der Einzelschritte. Auf diese Weise lässt sich die Entwicklung mehrerer Werte gleichzeitig komfortabel verfolgen.
Creditzs:
Jusikid

MFG Jusikid






