Lekcie
Ako hľadať a riešiť chyby v kóde - debugovanie
Počítač urobí presne to, čo mu povieme, aby spravil. Toto je v ideálnom svete super, avšak nie v našom, v ktorom robia ľudia chyby. Nauč sa, ako ich hľadať, ako ich riešiť a ako im predchádzať.
Chyby sú súčasťou programovania
Každý programátor, bez ohľadu na jeho skúsenosti, robí chyby. Nikto nepíše perfektný kód na prvý pokus. Rozdiel medzi začiatočníkom a skúseným programátorom nie je v tom, že skúsený chyby nerobí - je v tom, že ich vie rýchlo nájsť a opraviť. Táto zručnosť sa nazýva debugovanie (z anglického debugging).
Keď tvoj program nefunguje tak, ako má, Python ti vždy dá nejakú spätnú väzbu. Táto spätná väzba je chybová správa - takzvaný error. Mnohí začiatočníci sa errorov boja, ale v skutočnosti sú tvoji najlepší kamaráti. Error ti hovorí, čo je zle a kde to je zle.
Základné typy errorov
Python rozlišuje viacero typov errorov. Tu sú tie, s ktorými sa budeš stretávať najčastejšie:
| Typ erroru | Príčina | Príklad |
|---|---|---|
| SyntaxError | Chybný zápis kódu, ktorému Python nerozumie | prin t() |
| NameError | Premenná alebo funkcia neexistuje | print(premenna)
|
| TypeError | Nesprávny dátový typ pri operácii | "5"
+ 5
|
| ValueError | Hodnota má zlý obsah pre danú operáciu | int("ahoj")
|
| IndexError | Index mimo rozsahu zoznamu | zoznam[99]
|
| ZeroDivisionError | Delenie nulou | 10
/ 0 |
Ako čítať chybovú správu
Keď Python narazí na chybu, vypíše takzvaný traceback (spätná stopa). Je to správa obsahujúca informácie o volaniach funkcií v kóde v momente výskytu chyby. Na prvý pohľad to vyzerá strašidelne, ale stačí vedieť, čo kde hľadať. Pozri sa na tento príklad
Traceback (most recent call last):
File "program.py", line 3, in
vysledok = cislo / 0
ZeroDivisionError: division by zero
Čo nám to hovorí?
- Posledný riadok: typ erroru a jeho popis. Vždy začni čítať odtiaľto - ZeroDivisionError: division by zero hovorí jasne, čo sa stalo. V tomto prípade sme sa snažili vydeliť číslo nulou.
-
Riadok nad tým: ktorý riadok kódu chybu spôsobil (riadok 3, výraz
cislo / 0).
- Názov súboru a číslo riadku: kde presne sa error nachádza (program.py, line 3).
Čítaj chybové správy vždy zdola nahor. Posledný riadok ti dá typ a popis chyby, riadky nad ním ti ukážu, kde k nej došlo.
SyntaxError
SyntaxError nastane vtedy, keď kód nie je napísaný správne - podobne ako keby si napísal vetu bez zmyslu. Python takýto kód ani nespustí, hneď ti povie, že niečo nesedí.
Časté príčiny
-
Chýbajúca dvojbodka za
if,for,whilealebodef. - Nezatvorená zátvorka alebo úvodzovky.
- Písanie = namiesto == v podmienke.
# Chyba: chýba dvojbodka
if vek > 18
print("Dospelý")
# Správne:
if vek > 18:
print("Dospelý")
NameError
NameError sa objaví vtedy, keď sa snažíš použiť premennú alebo funkciu, ktorá neexistuje. Najčastejšie ide o preklep v názve premennej.
meno = "Mišo" print(menp) # NameError: name 'menp' is not defined # Správne: print(meno)
Ďalšia častá príčina: volanie funkcie pred jej definíciou.
pozdrav() # NameError - funkcia ešte neexistuje!
def pozdrav():
print("Ahoj!")
TypeError
TypeError nastane vtedy, keď sa snažíš spraviť operáciu s dátovým typom, ktorý ju nepodporuje. Najčastejšie, keď zabudneš pretypovať vstup od používateľa.
vek = input("Zadaj vek: ") # vek je str!
if vek >= 18: # TypeError: '>=' not supported between str and int
print("Dospelý")
# Správne:
vek = int(input("Zadaj vek: "))
if vek >= 18:
print("Dospelý")
ValueError
ValueError nastane vtedy, keď je
dátový typ správny, ale hodnota v ňom nemá pre danú operáciu zmysel. Klasický
príklad: snažíš sa pretypovať text, ktorý nie je číslo, na int.
cislo = int("ahoj") # ValueError: invalid literal for int()
cislo = int("3.14") # ValueError: int() nemôže spracovať desatinné číslo ako str
# Správne:
cislo = float("3.14") # 3.14
Postup pri hľadaní chyby
Keď tvoj program nefunguje, skús tento postup:
- Prečítaj error. Pozri sa na typ erroru a na číslo riadku. Toto ti ukáže, kde začať hľadať.
- Pozri sa na označený riadok. Chyba je niekedy priamo tam, niekedy o riadok vyššie (napr. pri SyntaxError).
- Použi print() na kontrolu. Ak nevieš, aká je hodnota premennej v danom momente, jednoducho ju vypíš: print(premenna). Toto je najjednoduchší a najrýchlejší spôsob debugovania.
- Debuguj po častiach. Ak máš veľký problém, skús izolovať problematickú časť - odstrihni kód po častiach a nájdi, kde nastáva chyba.
- Hľadaj online. Skopíruj text erroru do Google alebo AI. Takmer každý error, na ktorý narazíš, už niekto pred tebou riešil.
Debugovanie pomocou print()
Najjednoduchší spôsob, ako
zistiť, čo sa deje vo vnútri programu, je vypísať si hodnoty premenných pomocou
print(). Toto sa nazýva print debugging a používajú ho aj skúsení programátori.
def vypocitaj_zlavu(cena, zlava):
print("cena:", cena) # Skontroluj vstup
print("zlava:", zlava) # Skontroluj vstup
vysledok = cena - (cena * zlava / 100)
print("vysledok:", vysledok) # Skontroluj výsledok
return vysledok
vypocitaj_zlavu(20, 15)
Kde hľadať pomoc
Každý programátor hľadá pomoc online, je to súčasťou práce. Tu sú najlepšie miesta na hľadanie pomoci:
- Google + text erroru: jednoducho skopíruj text chybovej správy do Google. Následne študuj, ako iní ľudia riešili tvoj problém a inšpiruj sa.
- Stack Overflow alebo Reddit (a iné fórumy): najväčšie web stránky otázok a odpovedí o programovaní. S najväčšou pravdepodobnosťou tam niekto už riešil tvoj problém. Ak nie, tak si môžeš založiť účet a skúsiť tam hľadať pomoc od iných vývojárov a programátorov.
- Oficiálna dokumentácia Pythonu alebo dokumentácia knižnice, ktorú používaš. Často môže mať dôležité informácie, ktoré by si inak nezistil, napr. že funkcia v určitých podmienkach vracia False a pod.
- AI (napr. ChatGPT, Claude, Gemini): vie vysvetliť error, navrhnúť opravu alebo vysvetliť, prečo niečo nefunguje. Musíš dávať pozor, aby si AI nevymýšľalo riešenie alebo ťa neviedlo v kruhoch.
AI je super pomocník, ale nesnaž sa mu hádzať celý kód a čakať, že ho opraví za teba. Skús najprv problém vyriešiť sám. Skús pochopiť, čo sa deje, prečo tvoj kód nefunguje. AI ti má pomôcť pri učení, ale nie za teba riešiť všetky problémy. Programovanie sa naučíš len tým, že budeš sám premýšľať a písať kód.
Zopakuj si!
- Python ti vždy povie, čo je zle - čítaj chybové správy zdola nahor.
- Poznáš základné typy errorov: SyntaxError, NameError, TypeError, ValueErro a IndexError.
- Číslo riadku v errore ti ukáže, kde hľadať chybu.
print()je užitočný pri hľadaní chýb (debugovaní).- Keď si nevieš rady, hľadaj online, robí to každý.
suradnice = [100, 300] strom(suradnice[1], suradnice[2])
print("Vitajte na SuperZoznamke!")
print("Začneme vytvorením vášho profilu.")
meno = input("Meno:")
priezvisko = input("Priezvisko:")
rok_narodenia = int(input("Rok narodenia:"))
konicky = imput("Vaše koníčky:")
pohlavie = input("Pohlavie:")
print("Váš profil bol úspešne vytvorený!")
print("Vitajte, " + meno + "!")
input() bolo omylom napísané imput(). n a m sú vedľa seba na klávesnici, takéto chyby sa stávajú neustále.
x = input("Zadajte pocet opakovani: ")
symbol = input("Zadajte symbol: ")
print(symbol * x)
int. Dva str nevieme medzi sebou násobiť, avšak str a int vieme.
print("Počet výhercov: " + str(len(vyherci)) + "!)