ON ERROR
ON ERROR | |
Syntax: | ON ERROR: <befehl> |
Parameter | |
befehl: GOTO 10000 (Beispiel) | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Fehlerkontrolle |
Aufgabe: | Fehler während des Programmlaufs abfangen |
Abkürzung: | keine |
Token: | $64 $43 (100 67) |
Verwandte Befehle | |
NO ERROR - OUT - ERRN - ERRLN |
Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort ON ERROR.
Typ: Anweisung
Syntax: ON ERROR: <befehl>
Mit ON ERROR wird die Kontrolle, ob Fehler zu einer Fehlermeldung und einem damit verbundenen Programmabbruch führen, vom Interpreter ans Programm selbst übergeben. Da Fehler jederzeit im Programm auftauchen können, sollte ON ERROR gleich am Anfang des Programms stehen, am besten in der ersten Zeile. In der gleichen Zeile folgt auf den ON-ERROR-Befehl ein Befehl, der festlegt, was bei einem Programmfehler geschehen soll. Da auf einer einzigen Zeile nicht Platz genug für viel Information ist, setzt man hier üblicherweise einen Sprung an eine andere Stelle im Programm ein, z.B. ON ERROR: GOTO 10000
.
Dort könnte man dem User mitteilen, welcher Fehler vorlag (ERRN) und in welcher BASIC-Zeile er aufgetreten ist (ERRLN), damit er die Ursache des Fehlers beheben kann.
Leider verlässt Simons' Basic den Fehlerabfang-Modus nicht automatisch, wenn ein Programm beendet oder unterbrochen wird, so dass in den Zeilen der Benutzerinformation auf keinen Fall NO ERROR vergessen werden darf, und zwar sollte dieser Befehl gleich zu Anfang der Informationsroutine erfolgen. Wird das vergessen, führt jede Eingabe im Direktmodus lästigerweise auch dorthin, da ja die Fehlerursache noch nicht behoben wurde. Der Befehl OUT, der laut Handbuch unbedingt verwendet werden soll, um die Fehlerverfolgung abzuschalten, braucht nicht eingesetzt zu werden. OUT dient nicht dazu, ON ERROR zu beenden. Und schließlich ist die Simons'-Basic-Fehlerkontrolle nicht in der Lage, ihre eigenen Fehlernummern zu identifizieren, statt dessen wird der Default-Wert 128 in ERRN übergeben. Fehlermeldung und Zeilennummer werden allerdings ausgegeben (siehe Beispiel 2).
Die Fehlerkontrolle insgesamt wurde in TSB so überarbeitet, dass sie nunmehr voll funktionsfähig ist, siehe ON ERROR (TSB).
Beispiele[Bearbeiten | Quelltext bearbeiten]
Beispiel 1:
10 ON ERROR: GOTO 10000 15 PRIN "{clr/home}" 20 PRINT "ok" 10000 NO ERROR 10010 PRINT "in zeile " ERRLN "trat fehler nr." ERRN "auf." 10020 STOP
Bei einem Programmlauffehler springt der Interpreter in die BASIC-Zeile 10000.
Beispiel 2:
In dem folgenden Beispiel wird mit Hilfe von CGOTO ein RESUME NEXT simuliert.
10 ON ERROR: CALL FEHLER 20 PRIN CHR$(147) 30 PRINT"OK" 40 F="FEHLER": F$=5 50 CALL GIBSNICH 60 PRINT $22 70 PRINT "FERTIG" 80 EN=PEEK(57)+256*PEEK(58):END 90 : 1000 PROC FEHLER 1010 IF ERRN=128 AND ERRLN=EN THEN:NO ERROR:END 1020 IF ERRN=128 AND ERRLN<>EN THEN PRINT:GOTO 1040 1030 PRINT "FEHLER";ERRN;"IN ZEILE";ERRLN 1040 POKE 198,0:WAIT 198,255 1050 CGOTO ERRLN+10
- In der Zeile mit END - hier 80 - wird die Zeilennummer ermittelt und in der Variablen EN gespeichert. Diese letzte Zeile speichert die Fehlerbehandlung auch in ERRLN. Tritt kein Fehler auf, hat ERRN den Wert 128. In Zeile 1010 wird das Programm damit beendet, da die Fehlerzeile den Wert von EN hatte.
- Tritt ein Fehler eines Simons-Basic-Befehls auf, hat ERRN ebenfalls den Wert 128, da die Erweiterung ihre eigenen Fehlernummern nicht zuordnen kann. Die Zeilennummer ist zwar korrekt an ERRLN übergeben, aber da die Fehlermeldung sowieso ausgegeben wird (ohne Zeilenvorschub am Ende), wird die Ausgabe in Zeile 1030 nicht benutzt. Zeile 1020 behandelt diesen Fall.
- Der Rücksprung ins Programm wird mit Zeile 1050 erzeugt und funktioniert natürlich nur korrekt, wenn das Listing mit dem Zeilenabstand 10 durchnummeriert worden ist. Außerdem werden so weitere Fehler der gleichen Zeile - wie z.B. in 40 - nicht erkannt.
RUN FEHLER 11 IN ZEILE 20 OK FEHLER 22 IN ZEILE 40 ?PROC NOT FOUND IN 50 ?NOT HEX CHARACTER IN 60 FERTIG READY. |
$ | % | @ | ANGL | ARC | AT | AUTO | BCKGNDS | BFLASH | BLOCK | CALL | CENTRE | CGOTO | CHAR | CHECK | CIRCLE | CMOB | COLD | COLOUR | COPY | CSET | DELAY | DESIGN | DETECT | DIR | DISABLE | DISAPA | DISK | DISPLAY | DIV | DOWN | DRAW | DUMP | DUP | ELSE | END LOOP | END PROC | ENVELOPE | ERRLN | ERRN | EXEC | EXIT | EXOR | FCHR | FCOL | FETCH | FILL | FIND | FLASH | FRAC | GLOBAL | GRAPHICS | HI COL | HIRES | HRDCPY | INKEY | INSERT | INST | INV | JOY | KEY | LEFT | LIN | LINE | LOCAL | LOOP | LOW COL | MEM | MERGE | MMOB | MOB OFF | MOB SET | MOD | MOVE | MULTI | MUSIC | NO ERROR | NRM | OFF | OLD | ON ERROR | ON KEY | OPTION | OUT | PAGE | PAINT | PAUSE | PENX | PENY | PLACE | PLAY | PLOT | POT | PROC | RCOMP | REC | RENUMBER | REPEAT | RESET | RESUME | RETRACE | RIGHT | RLOCMOB | ROT | SCRLD | SCRSV | SECURE | SOUND | TEST | TEXT | TRACE | UNTIL | UP | USE | VOL | WAVE