BEGIN SEQUENCE
Fehlerobjekt
Traditionelle Fehlerbehandlung: ON ERROR
Debugging und Tracing-Tools
Benutzung des Debuggers
Tracing-Werkzeuge
Hinweis: Dies ist die vollständige deutsche Übersetzung des Kapitels. Codebeispiele sind sprachunabhängig gültig.
Ein robuster Programmcode braucht eine gute Fehlerbehandlung. Harbour bietet – wie sein Vorbild Clipper – ein leistungsfähiges Fehlersystem, das durch moderne Sprachmittel erweitert wurde.
Fehler lassen sich in drei Haupttypen einteilen:
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"
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.
Diese treten zur Laufzeit auf und verhindern die Ausführung. Beispiele:
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
Das Fehlerobjekt enthält z. B.:
description
– Textbeschreibungoperation
– Funktion, in der der Fehler entstandosCode
, subCode
– System-/Harbour-Codeargs
– übergebene ArgumenteON 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.
Compiliere mit -b
, z. B.:
hbmk2 meinprogramm.prg -b
Im Debug-Modus mit Alt+D
starten. Wichtigste Fenster:
Tastenkürzel:
F7
= Step IntoF8
= Step OverF9
= WeiterCtrl+F8
= Bis CursorProtokollierung ü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
.