Debugging - Befreien Sie Ihren Code von hässlichen Fehlern


 Zum vorherigen AbschnittZum nächsten Abschnitt Debugging - eine wichtige Programmierphase
Der Begriff "Debugging" ist mit viel Stress verbunden. Es bedeutet, Programme von Fehlern zu befreien. Man sollte schon bei der Planung die künftige Wartung des Programms einbinden. Viele Entwickler verwenden leider zu wenig Zeit auf diese wichtigen Wartungsarbeiten. Das ist auch der Hauptgrund weshalb viele "schwache" Programme entwickelt werden. Diese stürzen bei einer falschen Benutzereingabe ab oder weil eine Datei nicht existiert. Prominente Beispiele sind sogar große Firmen wie Microsoft oder Netscape.
Beim Debugging gibt es in den meisten Fällen drei Phasen:

Phase 1:
  Hier wird das Programm selbst geschrieben. Alle Prozeduren arbeiten mit den "richtigen" Benutzereingaben der Programmierer noch sehr gut.
 
Phase 2:
  In dieser Phase müssen Sie die Prozedur in Zusammenhang mit dem ganzen Projekt testen. Man befindet sich auch in dieser Phase, wenn ein Testfall nicht korrekt funktioniert.
 
Phase 3:
  In dieser Phase sollten Sie die Fehler, die in der "fertigen" Anwendung auftreten, beheben. Sie können die Folge einiger, nicht erwarteter Umstände sein:
  • Benutzeraktionen
  • Programmeinstellungen
  • Systemeinstellungen

 Zum vorherigen AbschnittZum nächsten Abschnitt Die VB-IDE - Debugging leicht gemacht(?)
Visual Basic bietet eine nahezu perfekte Entwicklungsumgebung, um Fehler zu finden und zu beseitigen. Es gibt mehrere Einstellungen, die die Arbeit der IDE entschieden verbessern:

Man kann in Visual Basic auch das Programm schrittweise ausführen. Diese Option kann sehr hilfreich sein und man findet dadurch meist viele Fehlerquellen. Es gibt hier mehrere Möglichkeiten zur Codeausführung:

Visual Basic bietet ein weiteres sehr nützliches Feature an: Haltepunkte. Das sind Codezeilen, bei denen die Ausführung automatisch angehalten wird. Man kann solche Haltepunkte auf drei Arten in das Programm einbringen: Mit der Teste F9, einem Klick links neben die Codezeile oder dem Befehl "Stop". Nachdem der Code an der gewünschten Zeile angehalten wurde, können Sie den Code schrittweise ausführen oder die normale Ausführung mit F5 fortsetzen. Sollten Sie Stop-Befehle verwenden, müssen Sie vor der Kompilierung alle Haltepunkte aus dem Code entfernen.


 Zum vorherigen AbschnittZum nächsten Abschnitt Werkzeuge für Debugger
Die Visual Basic IDE bietet auch mehrere Fenster an, die Sie zum Debuggen verwenden können und auch sollten:

 1.) Das Direktfenster:
      Sie können einen gültigen Ausdruck in das Direktfenster schreiben, und er wird sofort ausgeführt. Auf diese Art und Weise kann man Funktionen sehr gut testen und Werte der Variablen ändern oder auch abfragen. Sie können im Direktfenster eine Codezeile nicht über zwei oder mehr Zeilen mit Hilfe des Unterstrichs verteilen. Wollen Sie den Wert einer Variablen abfragen, müssen Sie vor den Variablennamen ein Fragezeichen setzen. Wollen Sie Strukturen oder Schleifen im Direktfenster verwenden, müssen Sie alles in eine Zeile schreiben und die Abschnitte mittels Doppelpunkten trennen:

If X = 3 Then
   MsgBox "X ist drei."
End If
müssen Sie beispielsweise so formulieren:
If X = 3 Then: MsgBox "X ist drei.": End If
 
 2.) Das Lokalfenster:
      Im Lokalfenster können Sie alle Variablen, die sich in der Reichweite der aktuellen Prozedur befinden, überprüfen. Genauer: Sie erfahren hier den Wert und den Datentyp der Variablen.
 
 3.) Das Überwachungsfenster:
      Manchmal ist es notwendig, eine Variable zu überwachen. Wird in Visual Basic eine Variable überwacht, kann man unter zwei Optionen wählen, zu welchem Zeitpunkt die Programmausführung unterbrochen werden soll:
  • Sobald der Wert "True" ist.
  • Wenn der Wert geändert wurde.
Das Fenster zeigt den aktuellen Ausdruck an, den Wert und den Datentyp sowie den Kontext. Der Kontext legt dabei den Gültigkeitsbereich des Ausdrucks fest.
 
 4.) Das Debugobjekt:
      Sie können das Direktfenster auch programmgesteuert mit Hilfe des Debugobjekts verwenden. Visual Basic entfernt beim Kompilieren automatisch den Code, der das Debugobjekt verwendet. Dieses Objekt verfügt nur über zwei Methoden:
  • Debug.Print
    Diese Methode schreibt einen String oder den Wert einer Variablen in das Direktfenster.

  • Debug.Assert
    Diese Methode bekommt einen bool'schen Ausdruck als Parameter übergeben und unterbricht, wenn dieser "False" ist.
 
 Zum vorherigen AbschnittZum nächsten Abschnitt Fehlerarten in VB
Es gibt in Visual Basic sechs Arten von Fehlern:

 1.) Syntaxfehler
      Um solche Fehler zu vermeiden, müssen Sie die korrekte Syntax der verwendeten Prozeduren kennen. Sie müssen alle Parameter auf ihre Richtigkeit überprüfen und - wenn nötig - richtig stellen, bevor Sie die Prozedur aufrufen. Syntaxfehler sind in VB meist besonders leicht zu finden, da inkorrekte Codezeilen bereits zur Entwicklungszeit in der IDE rot markiert werden. Spätestens zur Laufzeit jedoch meldet sich VB per Meldung über den Fehler zu Wort.
 
 2.) IDE - Fehler
      Diese Fehler können entstehen, wenn eine Visual-Basic-Prozedur mit der IDE oder Windows kommuniziert. Visual Basic generiert hierbei aber immer einen Laufzeitfehler, der Aufschluss über das Problem gibt.
 
 3.) Betriebssystem-Fehler
      Diese Fehler können eine Unzahl von Ursachen besitzen. Meistens hängt das mit OLE-Servern oder ActiveX-Komponenten zusammen. Diese Probleme treten erst auf, wenn Sie die Software ausserhalb der IDE starten.
 
 4.) Laufzeitfehler
      Visual Basic generiert Laufzeitfehler immer, wenn das Programm eine ungültige Aktion durchführen will. Wird z.B. eine Datei nicht gefunden oder benötigt eine Zahl mehr Speicherplatz als der Datentyp aufnehmen kann, erscheint ein solcher Laufzeitfehler. Visual Basic hat rund 500 mögliche Laufzeitfehler und es gibt sehr viele mehr, wenn Sie alle Laufzeitfehler der einzelnen Komponenten dazurechnen. Sie können sich in der VB-Downloadsektion ein kleines Programm inklusive Sourcecode herunterladen, dass eine Liste aller internen Fehler generiert. Sie finden es hier.
Man kann diese Laufzeitfehler nicht abschalten, aber man kann Sie auch sinnvoll einsetzen. Hier gleich ein Beispiel:

Sub FileExists()
   Dim Pfad As String
   Dim Temp As Long
   
   On Error Resume Next 'Erklärung siehe unten
   Pfad = InputBox("Geben Sie einen Pfad mit Dateinamen an:", "Aufforderung")
   Temp = GetAttr(Pfad)
   If Not (Err = 0) Then
      MsgBox "Diese Datei gibt es nicht!", vbCritical
   Else
      MsgBox "Die Datei wurde erfolgreich lokalisiert.", vbInformation
   End If
End Sub
 
 5.) Fehler beim Kompilieren
      Diese Fehler treten auf, wenn Sie das Programm in eine ausführbare Datei verwandeln wollen. Deaktivieren Sie dann bei den Optionen die Kästchen "Bei Bedarf" und "Im Hintergrund".
 
 6.) Menschliche Fehler
      Diese Fehler sind die gefährlichsten, da sie schwer zu finden sind und die IDE hier nicht helfen kann. Eigentlich hängen diese oft mit anderen zusammen und sorgen dafür, dass diese überhaupt ausgelöst werden. Solche Fehler treten oft in frisch programmiertem Code auf, beispielsweise wenn sich der Programmierer bei einem Variablennamen vertippt und kein "Option Explicit" verwendet wurde. Die hier sogenannten "menschlichen Fehler" sind ganz einfach zum größten Anteil Denkfehler der Programmierer.
 

 Zum vorherigen AbschnittZum nächsten Abschnitt Fehlerbehandlung
Visual Basic stellt ihnen verschiedene Möglichkeiten zur Fehlerbehandlung zu Verfügung. Mit folgenden Elementen können Sie zwar keine Laufzeitfehler verhindern, aber abfangen:
Das Err-Objekt speichert Informationen über den letzten Fehler. Mit dem Befehl Err.Raise kann man auch eigene Fehler generieren. Sie erhalten die Fehlernummer sowie die Beschreibung des Fehlers aus dem Err-Objekt. Das Err-Objekt hat folgende Mitglieder:

"On Error Resume Next" sollte sofort nach den Deklarationen in einer Prozedur stehen. Das ist die Grundvoraussetzung für die Verwendung des Err-Objekts. Dadurch ignoriert Visual Basic jeden Fehler und geht zur nächsten Zeile über. Die Prozedur "FileExist" (s.o.) würde ohne die Zeile "On Error Resume Next" nicht funktionieren. Sollte die Zeile nicht vorhanden sein, würde die Prozedur nur funktionieren, solange man einen gültigen Dateinamen eingibt. Ist der Dateiname ungültig wird die nächste Zeile, welche das Err-Objekt überprüft, nie ausgeführt.
Mit der Anweisung "On Error GoTo 0" werden Fehler in den folgenden Codezeilen wieder von VB behandelt und die alte Sprungmarke bzw. "Resume Next"-Anweisung wird ignoriert.

"On Error Goto <Label>" sollte genau wie "On Error Resume Next" sofort nach den Deklarationen innerhalb der Prozedur stehen, wenn es verwendet werden soll. Wenn ein Fehler auftritt, springt die Ausführung zum definierten Label. Jedoch sollte man Sprünge mit "GoTo", genauso wie "On Error Goto <Label>" vermeiden, da es schlechter Programmierstil ist. Dadurch entsteht der berühmte "Spaghetticode".

"Erl" speichert die Zeile, in der der Fehler aufgetreten ist. Man kann diese Variable jedoch nur gebrauchen, wenn man die Zeilen ständig durchnummeriert, ansonsten gibt VB einfach nur "0" zurück.



Quellen: VB-Empire.de.vu, SHADOWare.de
Letzte Änderung: 18.07.2001
©2001 by SHADOWare, Thomas Bachem