Harbour Handbuch – DE
HTML-Ausgabe

Kapitel 8

Hinweis: Dies ist die vollständige deutsche Übersetzung des Kapitels. Codebeispiele sind sprachunabhängig gültig.

Kapitel 8: Fehlerbehandlung und Debugging

Ein robuster Programmcode braucht eine gute Fehlerbehandlung. Harbour bietet – wie sein Vorbild Clipper – ein leistungsfähiges Fehlersystem, das durch moderne Sprachmittel erweitert wurde.

Fehlerarten

Fehler lassen sich in drei Haupttypen einteilen:

1. Syntaxfehler

Diese treten zur Compile-Zeit auf und verletzen Sprachregeln. Der Compiler meldet die Fehler mit Zeilennummer.

Häufige Ursachen:


// Fehler: fehlende schließende Klammer
? SUBSTR("Hallo Welt"

2. Logikfehler

Das Programm läuft, aber liefert falsche Ergebnisse – Fehler in der Programmstruktur.


FOR i := 1 TO 10
   IF i > 9
      ? "Neun"
   ENDIF
NEXT

Wird zwar ausgeführt, entspricht aber nicht der beabsichtigten Logik.

3. Laufzeitfehler

Diese treten zur Laufzeit auf und verhindern die Ausführung. Beispiele:

Strukturierte Fehlerbehandlung: BEGIN SEQUENCE

Empfohlene Methode zur Fehlerbehandlung in Harbour:


BEGIN SEQUENCE
   // Code, der fehlschlagen kann
[BREAK]
RECOVER USING oError
   // Fehlerbehandlung
END SEQUENCE

RECOVER USING oError fängt den Fehler, BREAK verlässt den Block ohne Fehler.


FUNCTION Dividiere( nZahl, nNenner )
   LOCAL nErgebnis

   BEGIN SEQUENCE
      IF nNenner == 0
         HB_DefaultError():New("Divisionsfehler", "Nenner darf nicht null sein", NIL,,,NIL,,,20):Throw()
      ENDIF
      nErgebnis := nZahl / nNenner
   RECOVER USING oError
      ? "Fehler beim Dividieren:"
      ? "Beschreibung:", oError:Description
      ? "Operation:", oError:Operation
      nErgebnis := NIL
   END SEQUENCE

   RETURN nErgebnis

Fehlerobjekt

Das Fehlerobjekt enthält z. B.:

Traditionelle Fehlerbehandlung: ON ERROR

Globale Fehlerfunktion wie in Clipper:


PROCEDURE Main()
   ON ERROR ErrorHandler( PCount(), ProcName( 1 ), ProcLine( 1 ) )
   ? 1 / 0
   RETURN

PROCEDURE ErrorHandler( nParams, cProc, nZeile )
   ALERT( "Fehler in: " + cProc + " Zeile " + LTrim( Str( nZeile ) ) )
   QUIT

Weniger flexibel als BEGIN SEQUENCE, da global und unstrukturiert.

Debugging und Tracing-Tools

Benutzung des Debuggers

Compiliere mit -b, z. B.:

hbmk2 meinprogramm.prg -b

Im Debug-Modus mit Alt+D starten. Wichtigste Fenster:

Tastenkürzel:

Tracing-Werkzeuge

Protokollierung über Textdateien:


#include "fileio.ch"

PROCEDURE AufwendigerProzess( cEingabe )
   LOCAL hLog := FCreate( "prozess_log.txt" )
   FWrite( hLog, "Start: " + Time() + HB_EOL )
   FWrite( hLog, "Eingabe: " + cEingabe + HB_EOL )

   IF Empty( cEingabe )
      FWrite( hLog, "FEHLER: Eingabe leer!" + HB_EOL )
   ENDIF

   FWrite( hLog, "Ende Prozedur." + HB_EOL )
   FClose( hLog )
RETURN

Alternativ: HB_TraceLog() aus hbdebug.