Diskussion:ON ERROR (TSB)

Aus C64-Wiki
Zur Navigation springenZur Suche springen

Beispiel[Quelltext bearbeiten]

In der alten Version des angegebenen Beispiels

10 ON ERROR: GOTO 10000
 
15 PRIN "{CLR/HOME}": PRINT "OK"
20 READ B
25 PRINT B: GOTO 20
30 DATA 1,2,3,4,5
 
10000 PRINT: PRINT "FEHLER NR." ERRN "(";: OUT: PRINT ")"
10010 PRINT "BETROFFENE ZEILE:" ERRLN: PRINT
10020 PRINT "BEENDEN (B)? FORTSETZEN (F)? ";: FETCH "FB",1,X$: PRINT
10030 IF X$ = "B" THEN PRINT: PRINT "ABBRUCH NACH FEHLER!": NO ERROR: STOP
10040 RESUME

musste das Programm wegen des Fehlers in den Zeilen 20-30 auf jeden Fall mit "B" abgebrochen werden. Dies verschleierte einen Fehler im Beispielprogramm und einen Mangel in der ON ERROR-Behandlung von TSB. Mit der folgenden alternativen Version wird dies deutlich:

10 ON ERROR: GOTO 10000
  
15 PRIN "{CLR/HOME}": PRINT "OK"
20 FOR I=1 TO 6: READ B: PRINT B: NEXT
30 DATA 1,2,3,4,5
 
10000 PRINT: PRINT "FEHLER NR." ERRN "(";: OUT: PRINT ")"
10010 PRINT "BETROFFENE ZEILE:" ERRLN: PRINT
10020 PRINT "BEENDEN (B)? FORTSETZEN (F)? ";: FETCH "FB",1,X$: PRINT
10030 IF X$ = "B" THEN PRINT: PRINT "ABBRUCH NACH FEHLER!": NO ERROR: STOP
10040 RESUME

Hier sind nur die Zeilen 20-25 geändert, damit der "OUT OF DATA" Fehler nur einmal auftritt. Führt man dieses Programm aus und versucht nur mit der Eingabe "F" zum Ende zu kommen, so ist das nicht möglich. Es tritt immer eine Fehlermeldung in der letzten Zeile auf (das liegt nicht etwa am "RESUME", was man sieht, wenn z.B. eine Zeile 10050 REM hinzugefügt wird). Logisch wäre es nun eigentlich, den letzten Aufruf der Fehlerroutine mit einer Zeile

40 END

zu vermeiden, doch das funktioniert so nicht, weil in TSB der Fehlerabfang-Modus zwar mit STOP, nicht aber mit END beendet wird.
Helfen würde hier

40 STOP

aber es geht auch mit END:

40 NO ERROR: END

--Petrus (Diskussion) 18:39, 11. Mär. 2022 (CET)

Guter Hinweis! Aber (ich zitiere: "einen Mangel in der ON ERROR-Behandlung von TSB") es liegt daran, dass in Basic V2 so etwas wie eine Error-Behandlung nicht vorgesehen war. Die Fehlerverfolgung wird zwar sofort abgeschaltet, wenn der C64 im Direktmodus ankommt. Leider führt der END-Befehl aber erst über die Warmstart-Routine dorthin (an $a854 in Basic V2 nach $e386, dort über jmp ($0300) nach $9e9f in TSB). Dort besteht das On-Error-Flag aber noch, weil der Direktmodus erst am Ende der Warmstartroutine eingeschaltet wird (endet in der Eingabewarteschleife). Das ist also der Grund, warum bei END die Fehlerverfolgung weiterläuft: TSB kommt wegen des (verständlichen) Mangels *in END* nicht im Direktmodus an und wirft weiter Fehler aus, jetzt im Endlos-Loop. Also, endgültiger Tipp (den du als letzten genannt hast): Wenn man ON ERROR verwendet, muss vor END ein NO ERROR stehen! Das ergänze ich noch bei den beiden Artikeln! --GoDot (Diskussion) 10:14, 12. Mär. 2022 (CET)

Mit der neuen TSB V2.20313 funktioniert END nun auch ohne vorheriges NO ERROR. -Petrus (Diskussion) 10:17, 14. Mär. 2022 (CET)