17. Chyby za behu: TRAP, STOP, END, RUN
Na čo to je
Niektoré chyby sa pri preklade zistiť nedajú: človek napíše písmená namiesto čísla, delí sa nulou, súbor na diskete nie je. Program vtedy vypíše ERROR- a skončí. S TRAP (anglicky „pasca“) sa chyba dá zachytiť: namiesto konca program skočí na riadok, ktorý si určíš, a tam sa rozhodne, čo ďalej.
Ako sa to píše
TRAP číslo riadka| Zápis | Význam |
|---|---|
TRAP 200 | keď nastane chyba, pokračuj riadkom 200 |
TRAP 40000 | zruš pascu (číslo väčšie než 32767 znamená „žiadna“) |
PEEK(195) | číslo chyby, ktorá nastala |
PEEK(186)+256*PEEK(187) | číslo riadka, na ktorom nastala |
PEEK číta bajt z pamäte počítača (kapitola 18); Atari si číslo chyby a riadok ukladá na tieto miesta. Zatiaľ ich ber ako zaklínadlo.
Pasca je na jedno použitie. Keď chyba nastane a program skočí, pasca je zrušená – ak ju chceš znova, musíš ju znova nastaviť.
A tri príkazy okolo konca programu:
| Príkaz | Význam |
|---|---|
END | ukončí program |
STOP | ukončí program a vypíše, na ktorom riadku |
RUN | spustí program odznova, s vynulovanými premennými |
Celý program
Súbor examples/trap.abas:
10 REM TRAP: catching an error
20 TRAP 200
30 PRINT "Divide 100 by (999 ends)";
40 INPUT N
50 IF N=999 THEN PRINT "Bye":END
60 PRINT "100/";N;" = ";100/N
70 GOTO 20
200 REM An error brought us here
210 E=PEEK(195):L=PEEK(186)+256*PEEK(187)
220 PRINT "Error ";E;" at line ";L
230 IF E=8 THEN PRINT "That was not a number"
240 IF E=11 THEN PRINT "Cannot divide by zero"
250 GOTO 20Preklad a spustenie
Basic26 trap.abas --runalebo v simulátore s odpoveďami zo súboru examples/trap.in (4, abc, 0, 999):
Basic26 trap.abas --sim --sim-input trap.inČo uvidíš
Divide 100 by (999 ends)?4
100/4 = 25
Divide 100 by (999 ends)?abc
Error 8 at line 40
That was not a number
Divide 100 by (999 ends)?0
100/0 = Error 11 at line 60
Cannot divide by zero
Divide 100 by (999 ends)?999
ByeAko to funguje
- Riadok 20 nastaví pascu. Kým nenastane chyba, nerobí nič.
- Odpoveď
abc:INPUT Nčaká číslo, takže je to chyba 8. Bez pasce by program skončil hlásenímERROR- 8 AT LINE 40. S pascou skočí na riadok 200. - Riadok 210 si hneď odloží číslo chyby a riadok do premenných.
- Riadok 250 sa vracia na riadok 20, nie 30 – aby sa pasca nastavila znova.
- Odpoveď
0:PRINTna riadku 60 stihol vypísať začiatok (100/0 =), až potom prišlo delenie a s ním chyba 11. Preto je hlásenie na tom istom riadku obrazovky.
Najčastejšie čísla chýb
| Číslo | Čo znamená |
|---|---|
| 2 | nie je pamäť (priveľký DIM) |
| 3 | hodnota mimo rozsahu (SQR(-1), LOG(0), záporný index) |
| 5 | reťazec: čítanie alebo zápis mimo jeho dĺžky |
| 6 | READ a žiadne DATA |
| 8 | text tam, kde malo byť číslo (INPUT, READ) |
| 9 | pole alebo reťazec: chýba DIM, alebo index mimo |
| 11 | delenie nulou alebo príliš veľké číslo |
| 12 | riadok neexistuje (vypočítaný GOTO) |
| 13 | NEXT bez FOR |
| 16 | RETURN bez GOSUB |
| 18 | VAL textu, ktorý nie je číslo |
| 128 a viac | chyby zariadení: súbor nie je, disk je plný … (kapitola 24) |
Celý zoznam je v prílohe C.
STOP a END
Oba program ukončia. STOP k tomu vypíše, kde:
10 PRINT "A":STOP:PRINT "B"A
STOPPED AT LINE 10Hodí sa pri hľadaní chyby: vieš, že program došiel až sem. Na Atari sa po STOP dalo pokračovať príkazom CONT; preložený program už pokračovať nevie.
Kláves BREAK na Atari robí to isté ako STOP – zastaví program a vypíše riadok.
RUN
RUN v programe ho spustí odznova: premenné sú nula, polia a reťazce neexistujú, DATA sa čítajú od začiatku, pasca je zrušená. Hra tak môže po skončení začať novú:
900 PRINT "Again (Y/N)";:INPUT A$
910 IF A$="Y" THEN RUNČasté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
| pasca sa po chybe nenastavila znova | druhá chyba program ukončí |
| obsluha chyby sama spôsobí chybu | program skončí – pasca už neplatí |
TRAP na riadok, ktorý nie je | pasca nič nezachytí a chyba program ukončí |
| pasca zakryje chybu, s ktorou si nepočítal | program sa správa čudne a nič nehlási; pri hľadaní chýb TRAP vypni |
| obsluha sa vráti doprostred slučky alebo podprogramu | FOR a GOSUB ostali rozrobené; vráť sa radšej na začiatok tej časti programu |
Vyskúšaj si
- Uprav program, aby pri chybe 8 vypísal
Please type a numbera inú chybu vypísal číslom. - Zmaž riadok 20 a zadaj
abc. Ako vyzerá hlásenie bez pasce? - Napíš slučku, ktorá číta
DATAbez toho, aby poznala ich počet:TRAPzachytí chybu 6 na konci zoznamu.
Zhrnutie
TRAP npošle program pri chybe na riadoknnamiesto toho, aby skončil.- Pasca platí na jednu chybu; potom ju treba nastaviť znova.
- Číslo chyby je v
PEEK(195), riadok vPEEK(186)+256*PEEK(187). STOPskončí s výpisom riadka,ENDpotichu,RUNzačne odznova.
Späť: 16. Matematika a náhoda · Ďalej: 18. Pamäť počítača