Python - 18. lekce
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama

Python - 18. lekcePython - 18. lekce

 

Python - 18. lekce

Google       Google       19. 4. 2006       16 985×

Chyby, výjimky, errory. Chyby jsou většinou nemilé, ohlašují nějakou špatnou zprávu. Jde ale o to, jestli nám chybové hlášky sdělují něco více než jen ERROR!. Nás určitě zajímá, kde a proč se tak chyba stala. Dokáže Python pomoci?

Reklama
Reklama

Chyby

Nikdo není neomylný, takže každý se dříve či později ve svém programu potká s nějakou chybou. Chyby mohou být obecně dvojí: logické a gramatické. Gramatické chyby nastávají, zjednodušeně řečeno, když napíšete něco špatně (překlep, apod.) a Python vám ohlásí, že se mu to nelíbí. Logické chyby nastávají, když si špatně uvědomíte problém, nesprávně naprogramujete, program sice funguje, ale dává špatné výsledky. Budeme se zabývat samozřejmě těmi gramatickými.

Chyby jsou vaši přátelé

Neměli byste chápat výpisy chyb jako zlo, jako něco špatného. Samozřejmě, je to nepříjemné, že tam máte chyby, ale Python vám chybu pomáhá velmi dobře vyhledat a určit. Nemůže ji za vás opravit, jen napovědět.

Představte si, že napíšete script a Python vám vyhodí tuto hlášku:

ERROR!!!!!

Tak takhle napsaná chyba by byla skutečně nepřítelem, protože vůbec nic neříká o tom kde, kdo a proč asi. Naštěstí je Python přívětivý a chybu nám přesně popíše:

Traceback (most recent call last):
  File "C:\Dokumenty\highlow.py", line 8, in ?
    if volba==cisl:
NameError: name 'cisl' is not defined

Rozbor chyby

Jednoduchý příklad

Zkusíme si tedy následující výpis chyby rozebrat řádku po řádce:

Traceback (most recent call last):
  File "C:\Dokumenty\highlow.py", line 8, in ?
    if volba==cisl:
NameError: name 'cisl' is not defined

Řádka Traceback… je startovací řádkou do výpisu chyby. Na druhém řádku je přesný název i umístnění souboru, kde chyba vznikla. A nejen to. Hlavně je tam číslo řádky, kde se chyba stala (line 8). Ve 3. řádce je tato řádka dokonce pro naše pohodlí vypsána :-). No a na posledním řádku je její slovní popis. V překladu snad takto: Chyba ve jménu: jméno 'cisl' není definováno.

Složitější příklad

1. Traceback (most recent call last):
2.   File "i:\Python\edu\livewires\B1110955.py", line 149, in ?
3.     vyrobRoboty()
4.   File "i:\Python\edu\livewires\B1110955.py", line 28, in vyrobRoboty
5.     robot.x, robot.y, robot.srot=narozeni()
6.   File "i:\Python\edu\livewires\B1110955.py", line 44, in narozeni
7.     return randint(0,63), randit(0,47),0
8. NameError: global name 'randit' is not defined
>>>

První řádek nic, ale hned ve druhém řádku je nějaké divné jméno souboru: B1110955.py. Kde se tam vzalo? To nic, to jen můj editor, PSPad, má takovou vlastnost, že když udělám v programu nějaké změny a neuložím je a chci program spustit přes F9, tak si nejdříve program uloží pod náhodným jménem (tentokrát to bylo B1110955.py) a teprve pak pustí. A chyba se stala na řádku 149. Na řádku 149 je ovšem jen volání funkce vyrobRoboty().

Výpis chyb tedy pokračuje dále, na řádce 4 jsme pořád ve stejném souboru, ale již jsme uvnitř funkce vyrobRoboty, a to na řádce 28. Tam je opět volání jiné funkce, tentokrát narozeni(). Asi bude chyba v této funkci, protože výpis pokračuje dále.

Na řádce 6 jsme se dostali do funkce narozeni(), kde hned pod tím vidíme:

    return randint(0,63), randit(0,47),0

V této řádce je někde chyba. Když se budeme pozorně dívat, tak ji hned objevíme (pokud tedy známe dobře funkci na náhodnou volbu čísel randint). Nicméně, Python nám ještě napovídá hned pod tím:

Chyba jména: globální jméno 'randit' není definováno.

Další práce je již na nás. Prostě si musíme uvědomit, že jsme udělali překlep a že nám chybí ve slově randit 'n'. Správně tedy 'randint' ;-).


Typy chyb

NameError

Chyba jména nastane většinou, když uděláte překlep v názvu proměnné. Když Python prostě o proměnné, kterou chcete, nikdy předtím neslyšel, nezná ji. Nebo když napíšete místo print primt ;-), což je ale vlstně to samé, protože v tomto případě Python hledá proměnnou 'primt' a nenalézá.

IndexError

Chyba indexu nastává, když se ze seznamu pokoušíte vydolovat prvek, který tam není. Příklad:

>>> jmena=["Curo","Frosty"]
>>> print jmena[10]
Traceback (most recent call last):
  File "", line 1, in ?
IndexError: list index out of range

SyntaxError

Python vyvolá tuto chybu, když mu prostě řádek absolutně nedává smysl, když tam něco má být, ale není. Příklad:

if a=b:                # má tam být a==b, chybí zde jedno =
if a==b                # chybí :
+                      # co se má sečíst?
while for:             # for není něco, co by mohlo být Pravda nebo Nepravda              

Ošetření chyb

Python nejen že dokáže pěkně vypsat, kde chyba je, ale dokáže tu chybu i v programu zachytit a zpracovat, takže ji můžeme využít v náš prospěch. Prostě něco, co zamezí výpisu chyby a tím i skončení programu. Jedná se o příkaz try: … except: ….

Jednoduchá ukázka na dělení nulou:

>>> 5/0
Traceback (most recent call last):
  File "", line 1, in ?
ZeroDivisionError: integer division or modulo by zero

Zachycení a ošetření chyby by mohlo vypadat takto:

try:                                  # zkus 
  print 5/0                           # 5/0                   
except:                               # pokud se to nepovede
  print "Delit nulou nelze."          # dej o tom vědět 
  

Úkol

V následujícím příkladu je spousta chyb. Opravte je. Většina je gramatických, ale mohou tam být i logické. Program musí prostě fungovat správně.

import random
cislo=random.randint(1,100)
pritn 'Myslím si cislo, uhodni jake

while x:
    volba=imput('Jake cislo si myslim? ')
    if volba=cisl:
       print "Uhodl jsi"
        break
    if Volba>cislo:
        print "Je to malo"
    elif Volba>cislo:
        print "Je to moc"

×Odeslání článku na tvůj Kindle

Zadej svůj Kindle e-mail a my ti pošleme článek na tvůj Kindle.
Musíš mít povolený příjem obsahu do svého Kindle z naší e-mailové adresy kindle@programujte.com.

E-mailová adresa (např. novak@kindle.com):

TIP: Pokud chceš dostávat naše články každé ráno do svého Kindle, koukni do sekce Články do Kindle.

4 názory  —  4 nové  
Hlasování bylo ukončeno    
0 hlasů
Google
(fotka) Pavel KosinaAutor programuje v Pythonu.
Web    

Nové články

Obrázek ke článku Blockchain & Bitcoin konference

Blockchain & Bitcoin konference

V pátek 19. 5. 2017 se v pražském konferenčním centru Andel’s konala Blockchain & Bitcoin konference. Řada odborníků a podnikatelů v oboru blockchainu a kryptoměn představila možnosti budoucího směřování tohoto oboru. Speakeři většinou rusky mluvící provenience prezentovali řešení svých firem založená na technologii blockchainu.

Reklama
Reklama
Obrázek ke článku Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Malware KONNI se úspěšně skrýval 3 roky. Odhalil ho bezpečnostní tým Cisco Talos

Bezpečnostní tým Cisco Talos odhalil celkem 4 kampaně dosud neobjeveného malwaru, který dostal jméno KONNI. Ten se dokázal úspěšně maskovat od roku 2014. Zpočátku se malware zaměřoval pouze na krádeže citlivých dat. Za 3 roky se ale několikrát vyvinul, přičemž jeho současná verze umožňuje útočníkovi z infikovaného počítače nejenom krást data, ale i mapovat stisky na klávesnici, pořizovat screenshoty obrazovky či v zařízení spustit libovolný kód. Pro odvedení pozornosti oběti zasílali útočníci v příloze také obrázek, zprávu a výhružkách severokorejského režimu či kontakty na členy mezinárodních organizací.

Obrázek ke článku Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Pouze jedna z deseti lokálních firem ví o pokutách plynoucích z GDPR

Trend Micro, celosvětový lídr v oblasti bezpečnostních řešení a VMware, přední světový dodavatel cloudové infrastruktury a řešení pro podnikovou mobilitu, oznámily výsledky výzkumu mezi českými a slovenskými manažery zodpovědnými za ochranu osobních údajů, který zjišťoval, jak jsou připraveni na nové nařízení o ochraně osobních údajů (GDPR). Většina firem v České republice a na Slovensku nad 100 zaměstnanců je již s novým nařízením GDPR obeznámena. Výzkum provedený ve spolupráci s agenturou Ipsos ukázal, že téměř 8 firem z 10 o nařízení ví, přičemž jeho znalost je o něco vyšší na Slovensku (89 %) než v České republice (69 %).

Obrázek ke článku Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Vyděračský software Locky se vrací, tváří se jako potvrzení platby, odhalil tým Cisco Talos

Jeden z nejznámějších ransomwarů, Locky, se vrací. Po většinu roku 2016 patřil mezi nejrozšířenější vyděračské softwary. Ke svému šíření využíval emailové kampaně s infikovanými přílohami. Ransomware Locky byl rozesílán prostřednictvím botnetu (internetový robot zasílající spamy) Necurs. Jeho aktivita na konci roku 2016 téměř upadla a spolu s ní i šíření ransomwaru Locky. Před několika týdny se Necurs opět probudil a začal posílat spamy nabízející výhodný nákup akcií. Dne 21. dubna zaznamenal bezpečnostní tým Cisco Talos první velkou kampaň ransomwaru Locky prostřednictvím botnetu Necurs za posledních několik měsíců.

loadingtransparent (function() { var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true; po.src = 'https://apis.google.com/js/plusone.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s); })();
Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032017 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý