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

Python - 18. lekcePython - 18. lekce

 

Python - 18. lekce

Google       Google       19. 4. 2006       16 407×

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 NEWTON Media prohledá 200  milionů mediálních zpráv během sekund díky Cisco UCS

NEWTON Media prohledá 200 milionů mediálních zpráv během sekund díky Cisco UCS

Česká společnost NEWTON Media provozuje největší archiv mediálních zpráv ve střední a východní Evropě. Mezi její zákazníky patří například ministerstva, evropské instituce nebo komerční firmy z nejrůznějších oborů. NEWTON Media rozesílá svým zákazníkům každý den monitoring médií podle nastavených klíčových slov a nabízí online službu, kde lze vyhledat mediální výstupy v plném znění od roku 1996.

Reklama
Reklama
Obrázek ke článku Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Delphi 10.1.2 (Berlin Update 2) – na co se můžeme těšit

Touto roční dobou, kdy je zem pokrytá barevným listím a prsty křehnou v mrazivých ránech, se obvykle těšíme na zbrusu novou verzi RAD Studia. Letos si však ale budeme muset počkat na Godzillu a Linux až do jara. Vezměme tedy za vděk alespoň updatem 2 a jelikož dle vyjádření pánů z Embarcadero se budou nové věci objevovat průběžně, pojďme se na to tedy podívat.

Obrázek ke článku Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Konference: Moderní datová centra pro byznys dneška se koná už 24. 11.

Stále rostoucí zájem o cloudové služby i maximální důraz na pružnost, spolehlivost a bezpečnost IT vedou k výrazným inovacím v datových centrech. V infrastruktuře datových center hraje stále významnější roli software a stále častěji se lze setkat s hybridními přístupy k jejich budování i provozu.

Obrázek ke článku Konference: Mobilní technologie mají velký potenciál pro byznys

Konference: Mobilní technologie mají velký potenciál pro byznys

Firmy by se podle analytiků společnosti Gartner měly  rychle přizpůsobit skutečnosti, že mobilní technologie už zdaleka nejsou horkou novinkou, ale standardní součástí byznysu. I přesto - nebo možná právě proto - tu nabízejí velký potenciál. Kde tedy jsou ty největší příležitosti? I tomu se bude věnovat již čtvrtý ročník úspěšné konference Mobilní řešení pro business.

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 © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý