ON ERROR GOTO
Routinen, die bei einem auftretenden Programmfehler zu einer bestimmten Zeile verzweigen, sind inzwischen Standardausrüstung jeder guten Basic-Erweiterung. Das vorliegende Maschinenprogramm ist nur 88 Byte lang.
Um einen Fehler während des Programmlaufs abzufangen, kennen viele Computer den Befehl ON ERROR GOTO. Mit diesem kurzen Maschinenprogramm kann auch Ihr C 64 auf Fehler im Programm reagieren.
Nachdem das Programm (Listing 1) im Speicher steht, kann es mit SYS 50000, ZL aktiviert werden. Dabei bedeutet ZL die Zeilennummer, zu der bei einem Fehler verzweigt werden soll. Die Fehlernummer wird dann in Speicherstelle 2 gespeichert und kann mit PEEK(2) abgefragt werden. Tabelle 1 zeigt, welche Nummer welcher Fehlermeldung entspricht. Die Zeile, in der der Fehler auftrat, wird in Speicherstelle 249 und 250 gespeichert. Damit Sie zu der fehlerhaften Zeile zurückspringen können, wurde noch die Routine »GOTO X« eingebaut. Damit läßt sich zu einer berechneten Zeile springen. Aufgerufen wird diese Routine mit SYS 50076, ZL. Schauen wir uns einmal das Beispiel ab Zeile 200 im Basic-Lader an. In Zeile 210 wird mit SYS 50000, 1000 die Fehlerbehandlungsroutine auf Zeile 1000 gelegt. In Zeile 220 wird der Benutzer aufgefordert, eine Zahl einzugeben. Solange diese Zahl positiv ist, wird in Zeile 230 die Wurzel aus dieser Zahl errechnet und ausgegeben. Bei einer negativen Zahl wird zur Zeile 1000 verzweigt. Hier wird die Fehlernummer ausgegeben. In diesem Falle 14. In Zeile 1010 wird nun die Zeile errechnet, in der der Fehler auftrat und ausgegeben. Zeile 1020 schließlich ruft die »GOTO X«-Routine auf und springt in die Zeile ZL —10.
Listing 2 zeigt den dokumentierten Assemblerteil der Routine.
(Kunz/tr)Fehlernummer | Fehlermeldung |
---|---|
1 | TOO MANY FILES |
2 | FILE OPEN |
3 | FILE NOT OPEN |
4 | FILE NOT FOUND |
5 | DEVICE NOT PRESENT |
6 | NOT INPUT FILE |
7 | NOT OUTPUT FILE |
8 | MISSING FILENAME |
9 | ILLEGAL DEVICE NUMBER |
10 | NEXT WITHOUT FOR |
11 | SYNTAX |
12 | RETURN WITHOUT GOSUB |
13 | OUT OF DATA |
14 | ILLEGAL QUANTITY |
15 | OVERFLOW |
16 | OUT OF MEMORY |
17 | UNDEF'D STATEMENT |
18 | BAD SUBSCRIPT |
19 | REDIM'D ARRAY |
20 | DIVISION BY ZERO |
22 | TYPE MISMATCH |
23 | STRING TOO LONG |
24 | FILE DATA |
25 | FORMULA TOO COMPLEX |
27 | UNDEF'D FUNCTION |
28 | VERIFY |
29 | LOAD |
100 rem *** on error und goto x *** 101 data32,253,174,32,107,169,165,20 102 data164,21,133,247,132,248,169,116 103 data160,195,141,0,3,140,1,3,96,169 104 data139,160,227,141,0,3,140,1,3 105 data96,138,48,30,165,58,201,255 106 data240,27,134,2,165,57,164,58,133 107 data249,132,250,165,247,164,248 108 data133,20,132,21,32,163,168,76 109 data174,167,76,116,164,138,76,58 110 data164,32,253,174,32,138,173,32 111 data247,183,76,143,195 112 s=0:fori= 50000 to 50087 :readd 113 poke i,d:s=s+d:next 114 print"die datazeilen sind" 115 ifs<>10886thenprint"fehlerhaft":stop 116 print"in ordnung":end 120 : 130 : 200 rem beispiel fuer on error und goto x 210 sys50000,1000 220 input"eine zahl ";a 230 wu=sqr(a):print"die wurzel aus"a"="wu 240 end 1000 print"fehler nummer"peek(2) 1010 zl=peek(249)+peek(250)*256-10 1020 sys50076,zl