TRAP
TRAP | |
Syntax: | TRAP [<Zeilennummer>] |
Parameter | |
<Zeilennummer>: numerischer Ausdruck im Wertebereich von 0 bis 65535 | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Fehlerbehandlung |
Aufgabe: | Sprungziel für eine Fehlerbehandlungsroutine festlegen |
Abkürzung: | tR |
Token: | $d7 (215) |
Verwandte Befehle | |
EL, ER, ERR$, HELP, RESUME |
Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl TRAP ab Commodore BASIC V3.5 oder höher.
Der BASIC-Befehl TRAP (dt. fangen, einfangen) legt ein Sprungziel für eine Fehlerbehandlungsroutine fest oder hebt es wieder auf.
Das Sprungziel, die sogenannte Fehlerbehandlungsroutine, wird sowohl bei Auftreten eines Fehlers als auch beim Drücken der Taste RUN/STOP aufgerufen. Zu diesem Zeitpunkt stehen die Systemvariablen ER mit dem Fehlercode und EL mit der Zeilennummer der auslösenden Programmzeile für eine bedingte Fehlerbehandlung zur Verfügung.[1]
Fehler innerhalb der Fehlerbehandlungsroutine werden nicht abgefangen[2]. Mittels RESUME wird die Fehlerbehandlung beendet und das Programm normal fortgesetzt. Aufgehoben wird die Fehlerbehandlung durch TRAP ohne Angabe einer Zeilennummer. Die Angabe einer Zeilennummer größer oder gleich 64000 liefert hingegen immer den Fehler ?UNDEF'D STATEMENT ERROR.
Der Parameter <Zeilennummer> darf (im Gegensatz zu den Sprungbefehlen GOTO und GOSUB) ein beliebiger numerischer Ausdruck sein, der einen Wert zwischen 0 und 65535 liefert. Ist das Ergebnis nicht numerisch, wird ?TYPE MISMATCH ERROR ausgegeben, ist das Ergebnis kleiner 0 oder größer 65535, wird ein ?ILLEGAL QUANTITY ERROR ausgelöst.
Der TRAP-Befehl überprüft nicht, ob das angegebene Sprungziel existiert. Tritt ein Fehler auf und das Sprungziel wird nicht gefunden, wird daher die etwas irreführende Fehlermeldung ?UNDEF'D STATEMENT ERROR IN <Zeilennummer> ausgegeben, wobei <Zeilennummer> die BASIC-Zeile ist, die den Fehler auslöste, nicht etwa die BASIC-Zeile des TRAP-Befehls.
Der BASIC-Befehl RENUMBER berücksichtigt auch TRAP, funktioniert aber nur korrekt, sofern der Parameter <Zeilennummer> eine numerische Konstante ist. Ausdrücke, die mit einer Variable oder einer Stringkonstante beginnen, werden nicht berücksichtigt. Bei Ausdrücken, die mit einer Zahl beginnen, gibt es 2 Möglichkeiten:
- Entspricht die Zahl der Nummer einer existierenden BASIC-Zeile, wird sie umgewandelt in die Nummer der BASIC-Zeile nach dem Renumber-Vorgang.
- Entspricht die Zahl keiner existierenden BASIC-Zeilennummer, wird ein ?UNRESOLVED REFERENCE ERROR ausgelöst.
Findet RENUMBER einen TRAP-Befehl mit einem Parameter größer 63999 (höchste erlaubte Nummer einer BASIC-Zeile) wird ein ?SYNTAX ERROR ausgegeben.
Anmerkungen
Beispiel[Bearbeiten | Quelltext bearbeiten]
100 TRAP 2000 105 FOR I=1 TO 2000: NEXT : REM CA. 2 SEK. WARTEN ... 110 SCHWERER SYNTAXFEHLER : PRINT " ... WEITER" 120 END 2000 REM FEHLERBEHANDLUNGSROUTINE 2010 PRINT ER; ERR$(ER) " ERROR IN ZEILE" EL "!" 2020 RESUME NEXT
sollte folgendes anzeigen
11 SYNTAX ERROR IN ZEILE 110 ! ... WEITER |
Wenn innerhalb der ersten beiden Sekunden nach dem Start die Taste RUN/STOP bestätigt wird, sieht die Ausgabe wie folgt aus:
30 BREAK ERROR IN ZEILE 105 ! 11 SYNTAX ERROR IN ZEILE 110 ! ... WEITER |
Diese Variante überspringt alle auftretenden Fehler, was wiederum zu ganz neuen Problemen führen könnte. Eine vom Fehlercode abhängige Programmierung ist hier mitunter anzuraten.
Mit aktiviertem Tracing (TRON) zeigt sich der Programmlauf detaillierter, speziell die Verzweigung zur Fehlerbehandlungsroutine ab Zeile 2000:
TRON RUN [100][105][110][2000][2010] 11 SYNTAX ERROR IN ZEILE 110 ! [2020][110] ... WEITER [120] |
AUTO | BACKUP | BOX | CHAR | CIRCLE | COLLECT | COLOR | COPY | DEC | DELETE | DIRECTORY | DLOAD | DO | DRAW | DS | DS$ | DSAVE | EL | ELSE | ER | ERR$ | EXIT | GETKEY | GRAPHIC | GSHAPE | HEADER | HELP | HEX$ | INSTR | JOY | KEY | LOCATE | LOOP | MONITOR | PAINT | PRINT USING | PUDEF | RCLR | RDOT | RENAME | RENUMBER | RESUME | RGR | RLUM | SCALE | SCNCLR | SCRATCH | SOUND | SSHAPE | TRAP | TROFF | TRON | UNTIL | VOL | WHILE