Fehler-Behandlung in FreeBASIC

FreeBASIC-Referenz » Verschiedene Themen » Fehler-Behandlung in FreeBASIC

Behandlung von Laufzeitfehlern

FreeBASIC (FB) kann Fehler auf folgende Arten behandeln:

Wichtig: Verursacht ein FreeBASIC-Programm einen allgemeinen Schutzfehler (etwa durch Zugriffe außerhalb des eigenen Speicherbereichs), wird die Programmausführung sofort vom Betriebssystem beendet. Ein solcher Fehler lässt sich mit den Fehlerbehandlungsmethoden ("Error handling") von FreeBASIC nicht abfangen und benutzerdefiniert behandeln.


Standardfehlerbehandlung

Das Standard-Verhalten von FreeBASIC ist, die ERR-Variable zu setzen und fortzufahren.

' Im Folgenden wird davon ausgegangen, dass die angegebene Datei xzxwz.zwz
' nicht existiert. Dann wird nämlich in ERR ein Fehler vermeldet.
Open "xzxwz.zwz" For Input As #1
Print Err
Sleep

Das Programm hält, obwohl die Datei nicht existiert, nicht an, sondern setzt die ERR-Variable und macht weiter. Der Fehler könnte in der nächsten Zeile ausgewertet werden.

Einige Ein-/Ausgabe-Funktionen OPEN, PUT... können in FUNCTION-Form benutzt werden (z. B. OPEN (Funktion)) und geben eine Fehlernummer zurück oder Null, wenn alles gut gegangen ist.

Print Open ("xzxwz.zwz" For Input As #1)
Sleep

QuickBASIC-ähnliche Fehlerbehandlung

Wenn mit den Schaltern -e, -ex oder -exx kompiliert wurde, wird vom Programm erwartet, dass eine QB-ähnliche Fehlerbehandlung geschieht. Erfolgt keine Fehlerbehandlung, stoppt das Programm mit einem Fehler.

Wichtig: Wenn die QB-ähnliche Fehlerbehandlung benutzt wird, muss der Programmierer sicherstellen, dass ALLE Fehlermöglichkeiten abgefangen werden. Beispielsweise erzeugt GETMOUSE einen Fehler, wenn der Cursor das aktuelle Fenster verlässt.

On Error Goto Ooops
Open "xzxwz.zwz" For Input As #1
On Error Goto 0
Sleep
End

Ooops:
Print Err
Sleep
End

ON ERROR setzt eine Fehlerbehandlungsroutine, und das Programm ruft sie auf, wenn ein Fehler gefunden wird.
ON ERROR GOTO 0 schaltet diese Fehlerbehandlung ab.

Wenn KEINE Fehlerbehandlungsroutine benutzt wird, falls ein Fehler auftritt, stoppt das Programm einfach und sendet eine Fehlermeldung an die Konsole.

Aborting program due to runtime error 2 (file not found)

(Abbruch wegen Laufzeitfehler 2 (Datei nicht gefunden)

Die "globale" Fehlerbehandlungsroutine kann wie in QB am Programmende stehen. Bei ON LOCAL ERROR kann eine lokale Fehlerbehandlung auf Prozedurebene erfolgen. Dazu muss das Unterprogramm (SUB oder FUNCTION) eine Codesequenz zur Fehlerbehandlung besitzen, die im Fehlerfall mittels GOTO angesprungen wird.

Declare Sub foo
foo
Sleep

Sub foo
    Dim filename As String
    filename = ""
    On Local Error Goto Ooops
    Open "" For Input As #1
    Print "Kein Fehler"
    On Local Error Goto 0
    Exit Sub
  Ooops:
    Print("Fehler " &Err &" in Function " &*Ermn &" in Zeile " &Erl)
End Sub

Erläuterung:
Beim Schalter -e muss die Fehlerbehandlungsroutine das Programm beenden, unabhängig vom verwendeten Dialekt.
Wird das Programm mit der Compileroption -ex und -lang qb compiliert, kann die Error-Handling-Routine mit einer RESUME-Anweisung (wiederholt die letzte Anweisung, die den Fehler hervorrief) oder RESUME NEXT-Anweisung (macht mit der nächsten Anweisung weiter) die Programmausführung nach Behandlung des Fehlers fortsetzen.
Wird compiliert, ohne eine Compileroption zur Fehlerbehandlung zu verwenden, dann wird der Fehler ignoriert.


Fehlernummern

FreeBASIC kennt folgende Laufzeit-Fehlercodes:

Nr.MeldungÜbersetzung
0No errorkein Fehler
1Illegal function callungültiger Funktionsaufruf
2File not found signalDatei nicht gefunden*
3File I/O errorDatei-Ein-/Ausgabe-Fehler
4Out of memoryZuwenig Speicher
5Illegal resumeungültiges RESUME
6Out of bounds array accessArray-Indexüberschreitung
7Null Pointer AccessNULL-Pointerzugriff
8No privilegesfehlende Berechtigungen
9interrupted signalUnterbrechung
10illegal instruction signalungültige Anweisung
11floating point error signalGleitkommafehler
12segmentation violation signalSpeicherzugriffsfehler
13Termination request signalBeendigungsanforderung
14abnormal termination signalunnormale Beendigung
15quit request signalAnfragesignal beendet
16return without gosubReturn ohne Gosub
17end of fileDateiende

*) Der Laufzeitfehler 2 (File not found) kann auch auftreten, wenn z. B. mit ENCODING "UTF-8" eine Datei geöffnet werden soll, die nicht UTF-8-codiert ist oder bei der das Byte Order Mark (BOM) nicht gesetzt ist.

Ein Bereich für Benutzer-Fehlermeldungen ist nicht vorgegeben. Wenn also ERROR benutzt wird, um einen benutzerdefinierten Fehlercode zu setzen, ist es vernünftiger, hohe Werte zu benutzen, um Überschneidungen mit den eingebauten Fehlermeldungen zu vermeiden, falls die obige Liste zukünftig einmal erweitert werden sollte.

Siehe auch:
ON ERROR, ERR (Funktion), ERFN, ERMN, ERROR, Fehlerbehandlung, Debugging