TRAP

Aus C64-Wiki
Zur Navigation springenZur Suche springen
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

  1. Erst nach dem Verlassen der Fehlerbehandlungsroutine durch RESUME werden ER und EL wieder auf -1 bzw. 65535 zurückgesetzt.
  2. Fehler innerhalb der Fehlerbehandlungsroutine werden nicht abgefangen: Ausgenommen bei BASIC 7.0, wenn bei RESUME mit Zeilennummer die adressierte Zeile nicht existiert!


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]