Na začátku si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která nastane v zanořené funkci.
Pročti si následující ukázkový příklad.
Tohle je absurdní ilustrační příklad, ne ukázka jak dobře programovat!
def podel(delenec, delitel):
"""Podělí čísla mezi sebou a vrátí výsledek."""
return delenec / delitel # řádek 3
def podel_nulou(cislo):
"""Vydělí dané číslo nulou a vrátí výsledek."""
return podel(cislo, 0) # řádek 8
def ukaz_priklad():
"""Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""
vysledek = podel_nulou(3) # řádek 13
print(vysledek)
ukaz_priklad() # řádek 16
Co se stane, ktyž tohle pustíš?
Traceback (most recent call last):
File "ukazka.py", line 16, in <module>
ukaz_priklad()
File "ukazka.py", line 13, in ukaz_priklad
vysledek = podel_nulou(3)
File "ukazka.py", line 8, in podel_nulou
return podel(cislo, 0)
File "ukazka.py", line 3, in podel
return delenec / delitel
ZeroDivisionError: division by zero
Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu. Skutečná chyba (tedy místo, které musíme opravit) je asi někde poblíž těchto míst:
podel
, vzniklo dělení nulou.
Měla by funkce podel
zjistit, jestli dostane nulu, a nějak na to
zareagovat?podel_nulou
, voláme podel
s dělitelem 0.
Má to tak opravdu být?ukaz_priklad
, voláme funkci podel_nulou
.
Kdybychom to nedělali, chyba by taky nevznikla!ukaz_priklad
.
Možná by to chtělo použít jiný příklad?Ale Python (a asi ani ty) nemůže vědět, co tím programem programátor myslel, a kdy by tedy bylo nejlepší chybu opravit. Ukáže tedy v programu všechna místa, která k chybě vedla. Je na programátorovi, aby z nich vybral to nejvhodnější a zaměřil se na něj.
Tahle ukázka je samozřejmě jen teoretická, ale v reálných programech vypadá hlášení chyb stejně. Až takovou složitou hlášku uvidíš, nepanikař! Python se snaží co nejvíc napovědět a usnadnit ti chybu najít a opravit. Sice stroze a anglicky, ale snaží. Vyjdi mu vstříc a nauč tyhle se hlášky číst.
{ "data": { "sessionMaterial": { "id": "session-material:2019/brno-podzim-pondeli:file:0", "title": "Chybové hlášky ze zanořených funkcí", "html": "\n \n \n\n <h1>Výpisy chyb ze zanořených funkcí</h1>\n<p>Na začátku si ukážeme (nebo zopakujeme), jak Python vypíše chybu, která\nnastane v zanořené funkci.</p>\n<p>Pročti si následující ukázkový příklad.</p>\n<div class=\"admonition note\"><p>Tohle je absurdní ilustrační příklad, ne ukázka jak dobře programovat!</p>\n</div><!-- XXX: automatic line numbers? -->\n\n<div class=\"highlight\"><pre><span></span><span class=\"k\">def</span> <span class=\"nf\">podel</span><span class=\"p\">(</span><span class=\"n\">delenec</span><span class=\"p\">,</span> <span class=\"n\">delitel</span><span class=\"p\">):</span>\n <span class=\"sd\">"""Podělí čísla mezi sebou a vrátí výsledek."""</span>\n <span class=\"k\">return</span> <span class=\"n\">delenec</span> <span class=\"o\">/</span> <span class=\"n\">delitel</span> <span class=\"c1\"># řádek 3</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">podel_nulou</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">):</span>\n <span class=\"sd\">"""Vydělí dané číslo nulou a vrátí výsledek."""</span>\n <span class=\"k\">return</span> <span class=\"n\">podel</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span> <span class=\"c1\"># řádek 8</span>\n\n\n<span class=\"k\">def</span> <span class=\"nf\">ukaz_priklad</span><span class=\"p\">():</span>\n <span class=\"sd\">"""Spočítá ukázkový příklad a výsledek vypíše (nevrátí!)"""</span>\n <span class=\"n\">vysledek</span> <span class=\"o\">=</span> <span class=\"n\">podel_nulou</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span> <span class=\"c1\"># řádek 13</span>\n <span class=\"k\">print</span><span class=\"p\">(</span><span class=\"n\">vysledek</span><span class=\"p\">)</span>\n\n<span class=\"n\">ukaz_priklad</span><span class=\"p\">()</span> <span class=\"c1\"># řádek 16</span>\n</pre></div><p>Co se stane, ktyž tohle pustíš?</p>\n<div class=\"highlight\"><pre><span></span><span class=\"gt\">Traceback (most recent call last):</span>\n File <span class=\"nb\">"ukazka.py"</span>, line <span class=\"m\">16</span>, in <span class=\"n\"><module></span>\n <span class=\"n\">ukaz_priklad</span><span class=\"p\">()</span>\n File <span class=\"nb\">"ukazka.py"</span>, line <span class=\"m\">13</span>, in <span class=\"n\">ukaz_priklad</span>\n <span class=\"n\">vysledek</span> <span class=\"o\">=</span> <span class=\"n\">podel_nulou</span><span class=\"p\">(</span><span class=\"mi\">3</span><span class=\"p\">)</span>\n File <span class=\"nb\">"ukazka.py"</span>, line <span class=\"m\">8</span>, in <span class=\"n\">podel_nulou</span>\n <span class=\"k\">return</span> <span class=\"n\">podel</span><span class=\"p\">(</span><span class=\"n\">cislo</span><span class=\"p\">,</span> <span class=\"mi\">0</span><span class=\"p\">)</span>\n File <span class=\"nb\">"ukazka.py"</span>, line <span class=\"m\">3</span>, in <span class=\"n\">podel</span>\n <span class=\"k\">return</span> <span class=\"n\">delenec</span> <span class=\"o\">/</span> <span class=\"n\">delitel</span>\n<span class=\"gr\">ZeroDivisionError</span>: <span class=\"n\">division by zero</span>\n</pre></div><p>Všimni si, že každá z funkcí, jejíž volání vedlo k chybě, je uvedena ve výpisu.\nSkutečná chyba (tedy místo, které musíme opravit) je asi někde poblíž těchto\nmíst:</p>\n<ul>\n<li>Na řádku 3, ve funkci <code>podel</code>, vzniklo dělení nulou.\nMěla by funkce <code>podel</code> zjistit, jestli dostane nulu, a nějak na to\nzareagovat?</li>\n<li>Na řádku 8, ve funkci <code>podel_nulou</code>, voláme <code>podel</code> s dělitelem 0.\nMá to tak opravdu být?</li>\n<li>Na řádku 13, ve funkci <code>ukaz_priklad</code>, voláme funkci <code>podel_nulou</code>.\nKdybychom to nedělali, chyba by taky nevznikla!</li>\n<li>Na řádku 16, ne ve funkci, voláme funkci <code>ukaz_priklad</code>.\nMožná by to chtělo použít jiný příklad?</li>\n</ul>\n<p>Ale Python (a asi ani ty) nemůže vědět, co tím programem programátor myslel,\na kdy by tedy bylo nejlepší chybu opravit.\nUkáže tedy v programu všechna místa, která k chybě vedla.\nJe na programátorovi, aby z nich vybral to nejvhodnější a zaměřil se na něj.</p>\n<p>Tahle ukázka je samozřejmě jen teoretická, ale v reálných programech vypadá\nhlášení chyb stejně.\nAž takovou složitou hlášku uvidíš, nepanikař!\nPython se snaží co nejvíc napovědět a usnadnit ti chybu najít a opravit.\nSice stroze a anglicky, ale snaží.\nVyjdi mu vstříc a nauč tyhle se hlášky číst.</p>\n\n\n " } } }