Čtení chyb

Chyby k programování patří. Dělají je i zkušení programátoři, a to každý den. Důležité je umět je rychle najít a opravit, a s tím vám pomůžou chybové hlášky. V Lua existují dva druhy chyb a jejich hlášky vypadají trochu jinak.

Chyby syntaxe. Než Lua program spustí, přečte si ho celý a zkontroluje, že je napsaný podle pravidel jazyka, tedy podle jeho syntaxe. Když najde chybu, třeba chybějící uvozovku, program vůbec nespustí, ani řádky před chybou. V tomto programu chybí na řádku 2 uvozovka:

print("Dobré ráno, Emo!")
print("Nakrmit slepice)
print("Podojit Bellu")

Výstup zůstane prázdný a pod ním se červeně objeví chybová hláška:

main.lua:2: unfinished string near '"Nakrmit slepice)'

Čtěte ji zleva:

  • main.lua je název souboru s programem. Na tomto webu se program v editoru vždycky jmenuje main.lua.
  • 2 je číslo řádku s chybou. Čísla řádků vidíte v editoru vlevo.
  • Za druhou dvojtečkou následuje anglický popis chyby. unfinished string znamená neukončený text (řetězec). near (poblíž) ukazuje místo, kde se problém projevil: u textu, který začíná "Nakrmit slepice). Chybí mu koncová uvozovka, a tak pokračuje až do konce řádku a závorka ) se stala jeho součástí.

Hláška ukazuje, kde se chyba projevila, a to nemusí být místo, kde opravdu je. Když chybí uzavírací závorka, pozná to Lua až na dalším řádku:

print("Dobré ráno, Emo!"
print("Nakrmit slepice")

Lua ohlásí:

main.lua:2: ')' expected (to close '(' at line 1) near 'print'

')' expected znamená, že Lua čekala ), a (to close '(' at line 1) říká, kterou závorku má uzavřít: tu na řádku 1. Když tedy řádek z hlášky vypadá v pořádku, podívejte se na řádek nad ním. A když Lua dojde na konec programu a pořád na něco čeká, končí hláška slovy near <eof>: eof je z anglického end of file, konec souboru.

Chyby za běhu. Program bez chyb syntaxe se spustí a Lua provádí jeden řádek za druhým. Když narazí na příkaz, který provést nejde, zastaví se. Co program do té doby vypsal, ve výstupu zůstane a chybová hláška se objeví pod tím:

print("Dobré ráno, Emo!")
print("Nakrmit slepice")
prnt("Podojit Bellu")
print("Zalít mrkev")

Program vypíše první dva řádky a za nimi následuje červená chybová hláška:

Dobré ráno, Emo!
Nakrmit slepice
main.lua:3: attempt to call a nil value (global 'prnt')
stack traceback:
	main.lua:3: in main chunk

První řádek hlášky má stejné části jako předtím: soubor, řádek (3) a popis. attempt to call a nil value (global 'prnt') znamená, že se program pokusil zavolat něco, co se jmenuje prnt, ale nic (nil) takového neexistuje. print Lua zná, prnt ne. Když uvidíte attempt to call a nil value, hledejte překlep v názvu, třeba prnt nebo Print.

Pod tím stack traceback: vypisuje, kudy program procházel, když chyba nastala, od nejnovějšího místa. main.lua:3: in main chunk znamená řádek 3 v hlavní části vašeho programu. Až budou mít vaše programy vlastní funkce, bude tenhle seznam delší a ukáže, která funkce volala kterou. Zatím vám stačí první řádek hlášky. Řádek výpisu, který začíná [C]:, patří k samotnému jazyku Lua (ten je napsaný v jazyce C) a můžete ho přeskočit.

Hlášky, na které budete často narážet:

  • unfinished string: chybí uvozovka na konci textu, nebo se uvozovky na začátku a na konci liší, třeba "Ahoj'.
  • ')' expected: chybí závorka, nebo slova nejsou v uvozovkách: print(Ahoj Emo) skončí hláškou ')' expected near 'Emo'.
  • attempt to call a nil value: překlep v názvu funkce.
  • attempt to add a 'string' with a 'number': + místo .. při spojování textu a čísla.

Opravte vždy první chybu, kterou Lua ohlásí, a program spusťte znovu. Chyba syntaxe může zakrývat další chyby, protože dokud ji neopravíte, nespustí se nic. A chyba za běhu program zastaví, takže řádky pod ní se ještě vůbec nevyzkoušely.

Pokyny

Emin večerní přehled v editoru má tři chyby. Spusťte program a přečtěte si chybovou hlášku: na kterém řádku je chyba a co je špatně? Opravte ji a program spusťte znovu. Opakujte to, dokud program nevypíše:

Večerní přehled
Vejce dnes: 12
Mléko: 12 litrů
Mince: 60
Zítra: déšť
Dobrou noc, Rexi!

Začněte programovat zdarma

Registrací souhlasíte s provozními podmínkami a zásadami ochrany osobních údajů.

Nebo se registrujte pomocí:

6/7