ON ERROR

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

Ergebnis des Beispielprogramms


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.