Diskussion:ON ERROR (TSB)
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)