Referenz - Fehler-Behandlung in FreeBASIC
Behandlung von Laufzeitfehlern
FreeBASIC kann Laufzeitfehler auf folgende Arten behandeln:
- Normalerweise reagiert ein Programm nicht auf die auftretenden Fehler - sie werden einfach ignoriert und der Code wird weiter ausgeführt. Das Programm sollte mögliche Fehler über die Variable ERR in der nächsten Zeile abfangen.
- Einige Anweisungen können auch als Funktion eingesetzt werden und geben dann ggf. die Fehlernummer zurück (siehe z. B. OPEN (Funktion).
- Wenn mit den Compileroptionen -e, -ex oder -exx kompiliert wurde, benutzt FreeBASIC eine QB-ähnliche Fehlerbehandlung.
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, bei einem Fehler die Variable ERR 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 Variable ERR und macht weiter. Der Fehler könnte in der nächsten Zeile ausgewertet werden.
Achtung: Bei der Verwendung von PRINT wird ERR anschließend auf 0 zurückgesetzt. Gegebenenfalls sollte ihr Wert zuvor in eine andere Variable kopiert werden.
Einige Ein- und Ausgabe-Routinen wie OPEN und PUT können als Funktion eingesetzt werden und geben eine Fehlernummer zurück. Wenn kein Fehler aufgetreten ist, wird 0 zurückgegeben.
Print Open ("xzxwz.zwz" For Input As #1)
Sleep
QB-ä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, die vom Programm aufgerufen wird, wenn ein Fehler gefunden wurde.
ON ERROR GOTO 0 schaltet diese Fehlerbehandlung ab.
In den Dialektformen -lang qb und -lang deprecated steht außerdem der Befehl RESUME zur Verfügung, um nach einem Fehler wieder mit der Programmausführung fortzufahren.
Wenn keine Fehlerbehandlungsroutine benutzt wird und ein Fehler auftritt, stoppt das Programm 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 der Anweisung RESUME (wiederholt die letzte Anweisung, die den Fehler hervorrief) oder RESUME NEXT (fährt mit der nächsten Anweisung fort) 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 |
---|---|---|
0 | No error | kein Fehler |
1 | Illegal function call | ungültiger Funktionsaufruf |
2 | File not found signal | Datei nicht gefunden* |
3 | File I/O error | Datei-Ein-/Ausgabe-Fehler |
4 | Out of memory | Zu wenig Speicher |
5 | Illegal resume | ungültiges RESUME |
6 | Out of bounds array access | Array-Indexüberschreitung |
7 | Null Pointer Access | Nullpointer-Zugriff |
8 | No privileges | fehlende Berechtigungen |
9 | interrupted signal | Unterbrechung |
10 | illegal instruction signal | ungültige Anweisung |
11 | floating point error signal | Gleitkommafehler |
12 | segmentation violation signal | Speicherzugriffsfehler |
13 | Termination request signal | Beendigungsanforderung |
14 | abnormal termination signal | unnormale Beendigung |
15 | quit request signal | Anfragesignal beendet |
16 | return without gosub | RETURN ohne GOSUB |
17 | end of file | Dateiende |
*) 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
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|