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

Atari BASIC
TRAP číslo riadka
ZápisVýznam
TRAP 200keď nastane chyba, pokračuj riadkom 200
TRAP 40000zruš 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íkazVýznam
ENDukončí program
STOPukončí program a vypíše, na ktorom riadku
RUNspustí program odznova, s vynulovanými premennými

Celý program

Súbor examples/trap.abas:

Atari BASIC
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 20

Preklad a spustenie

Basic26 trap.abas --run

alebo 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
Bye

Ako to funguje

Najčastejšie čísla chýb

ČísloČo znamená
2nie je pamäť (priveľký DIM)
3hodnota mimo rozsahu (SQR(-1), LOG(0), záporný index)
5reťazec: čítanie alebo zápis mimo jeho dĺžky
6READ a žiadne DATA
8text tam, kde malo byť číslo (INPUT, READ)
9pole alebo reťazec: chýba DIM, alebo index mimo
11delenie nulou alebo príliš veľké číslo
12riadok neexistuje (vypočítaný GOTO)
13NEXT bez FOR
16RETURN bez GOSUB
18VAL textu, ktorý nie je číslo
128 a viacchyby 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:

Atari BASIC
10 PRINT "A":STOP:PRINT "B"
A

STOPPED  AT LINE 10

Hodí 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ú:

Atari BASIC
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 znovadruhá chyba program ukončí
obsluha chyby sama spôsobí chybuprogram skončí – pasca už neplatí
TRAP na riadok, ktorý nie jepasca nič nezachytí a chyba program ukončí
pasca zakryje chybu, s ktorou si nepočítalprogram sa správa čudne a nič nehlási; pri hľadaní chýb TRAP vypni
obsluha sa vráti doprostred slučky alebo podprogramuFOR a GOSUB ostali rozrobené; vráť sa radšej na začiatok tej časti programu

Vyskúšaj si

  1. Uprav program, aby pri chybe 8 vypísal Please type a number a inú chybu vypísal číslom.
  2. Zmaž riadok 20 a zadaj abc. Ako vyzerá hlásenie bez pasce?
  3. Napíš slučku, ktorá číta DATA bez toho, aby poznala ich počet: TRAP zachytí chybu 6 na konci zoznamu.

Zhrnutie

Späť: 16. Matematika a náhoda · Ďalej: 18. Pamäť počítača