Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > General Coding > Coding Tutorials
You last visited: Today at 02:43

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[VB.Net] Fehlerbehandlung

Discussion on [VB.Net] Fehlerbehandlung within the Coding Tutorials forum part of the General Coding category.

Reply
 
Old   #1
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
[VB.Net] Fehlerbehandlung

Hallo Elitepvpers

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
OverFlowException

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
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 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
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ä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
Jay Niize is offline  
Thanks
4 Users
Old 05/05/2010, 18:01   #2
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Sieht sehr gut aus?
Eine Frage. Kann man Exceptionen selber erstellen bzw. selbst definierte benutzen?
HardCore.1337 is offline  
Old 05/08/2010, 10:02   #3
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
wie meinst du das? bitte eine genauere angabe
Jay Niize is offline  
Old 05/08/2010, 11:33   #4
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Naja, es gibt ja vorgefertigte Exceptionen (z.B. Division durch Null. Zu wenig Speicher...)
In anderen Programmiersprachen gibt es dann noch die Möglichkeit, eine eigne Exception zu erstellen.
Z.B. kann eine Exception ausgelöst werden, wenn ein String über 20 Zeichen hat (über den Sinn sprechen wir erstmal nicht )

Also man leitet sozusagen eine Exception (Klasse) ab aus der ursprungsexception ab.
Wenn du nicht verstehst was ich meine (kann man auch wirklich schwer beschreiben), kann ich dir auch gerne einen Beispielcode geben (dann aber kein VB)
HardCore.1337 is offline  
Old 05/08/2010, 13:52   #5
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
xD achso jetzt verstehe ich was du meinst xDD

Du könntest klar eine erstellen, den Code Edite ich gleich noch rein! DU könntest auch per Windows (system32) die ganzen Codes ändern, sowie neue Hnzufügen

Mit Code meien ich z.B 70 : Berechtigung verweigert, oder 6 :Überlauf!
Jay Niize is offline  
Thanks
1 User
Old 05/08/2010, 19:30   #6
 
HardCore.1337's Avatar
 
elite*gold: 1
Join Date: Feb 2009
Posts: 1,726
Received Thanks: 729
Ok, das war halt meine Frage.
HardCore.1337 is offline  
Old 05/09/2010, 00:55   #7
 
Shadowz75's Avatar
 
elite*gold: 0
Join Date: Mar 2009
Posts: 443
Received Thanks: 597
Quote:
Originally Posted by General Desert View Post
Naja, es gibt ja vorgefertigte Exceptionen (z.B. Division durch Null. Zu wenig Speicher...)
In anderen Programmiersprachen gibt es dann noch die Möglichkeit, eine eigne Exception zu erstellen.
Z.B. kann eine Exception ausgelöst werden, wenn ein String über 20 Zeichen hat (über den Sinn sprechen wir erstmal nicht )

Also man leitet sozusagen eine Exception (Klasse) ab aus der ursprungsexception ab.
Wenn du nicht verstehst was ich meine (kann man auch wirklich schwer beschreiben), kann ich dir auch gerne einen Beispielcode geben (dann aber kein VB)
brauchst gar nicht fragen, der hat eh keine ahnung, denn das ist alles copy paste von einem buch(schaut auf die leserprobe, dass ist der selbe text)


//edit:und sich auch noch selber credits geben ist extrem dreist, sowas verdient ne verwarnung
Shadowz75 is offline  
Thanks
1 User
Old 05/09/2010, 07:21   #8
 
Jay Niize's Avatar
 
elite*gold: 0
Join Date: Oct 2009
Posts: 4,851
Received Thanks: 3,417
xD ich hab doch die in die Credits geschrieben xD und ich hab mich in die Credits geschrieben, da ohne diesen Thread das alles nicht da wäre
Ich habe die Seite unter Credits mit dem Namen Galileo mit dem link zur Homepage angegeben^^

Edit : Und woher willst du wissen das ich nix davon weiss Ich hab mir schon vor 2 Jahren des Buch gekauft, wobei sich andere Noobs das versuchen zu cracken, aber fail sind? xD
Jay Niize is offline  
Old 12/26/2010, 11:32   #9
 
elite*gold: 0
Join Date: Dec 2010
Posts: 136
Received Thanks: 67
ehm Jusikid Könntes du mal wieder das hier alles neu reinstellen bei mir ist alles weg -.-
XSedrikX is offline  
Reply




All times are GMT +1. The time now is 02:44.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.