33Pojďme si prohloubit znalosti o chybách, neboli odborně o * výjimkách*
44(angl. * exceptions* ).
55
6- Vezměme následující funkci:
6+ Vezmi následující funkci:
77
88``` python
99def nacti_cislo ():
@@ -22,7 +22,7 @@ Traceback (most recent call last):
2222ValueError: invalid literal for int() with base 10: 'cokolada'
2323```
2424
25- Program volá funkci ` int() ` pro neco , co nedává smysl jako číslo.
25+ Program volá funkci ` int() ` pro něco , co nedává smysl jako číslo.
2626Co s tím má chudák funkce ` int ` dělat?
2727Není žádná rozumná hodnota, kterou by mohla vrátit.
2828Převádění tohoto textu na celé číslo nedává smysl.
@@ -49,6 +49,23 @@ Nechceme ji psát znovu – funkce `int` sama nejlíp pozná, co se dá převés
4949číslo a co ne.
5050A dokonce nám to dá vědět – chybou, kterou můžeme * zachytit* .
5151
52+ > [ note]
53+ > Ono „obsahuje_jen_cislice“ v Pythonu existuje. Dokonce několikrát.
54+ > Místo řešení problému to ale spíš ilustruje, v čem problém spočívá:
55+ > * Řetězcová metoda ` isnumeric ` vrací ` True ` pokud řetězec obsahuje číslice:
56+ > ` '123'.isnumeric() ` je pravda; ``'abc'.isnumeric()` nepravda.
57+ > Problém je, že funkci ` int ` potřebuje jeden konkrétní druh číslic:
58+ > pro řetězce jako ` '½' ` nebo ` '௩三๓໓ ` ' (trojka v tamilském, japonském,
59+ > thajském nebo laoském písmu) platí ` isnumeric ` , ale ` int ` si na nich
60+ > vyláme zuby stejně jako na ` 'abc' ` .
61+ > * Řetězcová metoda ` isdecimal ` vrací ` True ` pokud řetězec obsahuje arabské
62+ > číslice 0-9. To už je lepší, ale stejně to úplně nesedí: ` int ` si poradí
63+ > s mezerou na začátku, např. s ` ' 3' ` . Funkce ` isnumeric ` takový řetězec
64+ > odmítne.
65+ >
66+ > Chceš-li se zeptat jestli funkce ` int ` umí daný řetězec převést na číslo,
67+ > nejlepší způsob jak to udělat je použít funkci ` int ` .
68+
5269
5370## Ošetření chyby
5471
@@ -98,6 +115,9 @@ BaseException
98115 ╰── ValueError špatná hodnota, např. int('xyz')
99116```
100117
118+ Tohle si není potřeba pamatovat – druh chyby, kterou je potřeba zachytit,
119+ vždy najdeš v příslušné chybové hlášce.
120+
101121Když odchytáváš obecnou výjimku,
102122chytnou se i všechny podřízené typy výjimek –
103123například ` except ArithmeticError: ` zachytí i ` ZeroDivisionError ` .
@@ -110,21 +130,24 @@ Většinu chyb *není* potřeba ošetřovat.
110130
111131Nastane-li * nečekaná* situace, je téměř vždy
112132mnohem lepší program ukončit, než se snažit
113- pokračovat dál počítat se špatnými hodnotami.
133+ pokračovat dál a počítat se špatnými hodnotami.
114134Navíc chybový výstup, který Python standardně
115135připraví, může hodně ulehčit hledání chyby.
116136
117137Zachytávej tedy jenom ty chyby, které * očekáváš* – víš přesně, která chyba může
118138nastat a proč, a máš možnost správně zareagovat.
119139
120- V našem příkladu to platí pro ` ValueError ` z funkce ` int ` .
140+ V našem příkladu to platí pro ` ValueError ` z funkce ` int ` : víš že uživatel
141+ nemusí vždy zadat číslo ve správném formátu a víš že správná
142+ reakce na tuhle situaci je problém vysvětlit a zeptat se znovu.
121143
122144Co ale dělat, kdyš uživatel chce ukončit program a zmáčkne
123145<kbd >Ctrl</kbd >+<kbd >C</kbd >?
124146Nebo když se mu porouchá klávesnice a selže funkce ` input ` ?
125- V obou případech je nejlepší reakce ukončit program a informovat
126- programátora, že (a kde) je něco špatně.
127- Neboli vypat chybovou hlášku – to, co se stane normálně, bez ` try ` .
147+ Nejlepší reakce na takovou nečekanou situaci ukončit program a informovat
148+ uživatele (nebo lépe, programátora), že (a kde) je něco špatně.
149+ Neboli vypsat chybovou hlášku.
150+ A to se stane normálně, bez ` try ` .
128151
129152
130153## Další přílohy k ` try `
@@ -178,7 +201,7 @@ Měla by být použitelná ve všech případech výše – a v mnoha dalších
178201
179202Když někdo zavolá ` obsah_ctverce(-5) ` , * neexistuje* správný výsledek, který by
180203funkce mohla vrátit.
181- Místo vracení výsledku musí tato funkce * signalizovat chybu* .
204+ Místo vrácení výsledku musí tato funkce * signalizovat chybu* .
182205S tou se pak může program, který ` obsah_ctverce(-5) ` zavolal,
183206vypořádat – vynadat uživateli, zkalibrovat měřák, nebo, pokud na chybu není
184207připravený, sám skončit s chybou (a upozornit tak programátora, že je něco
@@ -191,16 +214,16 @@ Za příkaz dáš druh výjimky a pak do závorek nějaký popis toho, co je šp
191214``` python
192215def obsah_ctverce (strana ):
193216 if strana > 0 :
194- return strana * strana
217+ return strana ** 2
195218 else :
196219 raise ValueError (f ' Strana musí být kladná, číslo { strana} kladné není! ' )
197220```
198221
199222Podobně jako ` return ` , i příkaz ` raise ` ukončí funkci.
200- A nejen tu – pokud na tuhle konkrétní chybu program předem připravený,
223+ A nejen tu – pokud na tuhle konkrétní chybu není program předem připravený,
201224ukončí se celý program.
202225
203- Ze začátku není příliš důležité dumat nad tím, který typ výjimky je ten
204- správný.
226+ Ze začátku není u ` raise ` příliš důležité dumat nad tím, který typ výjimky je
227+ ten správný.
205228Klidně „střílej od boku“.
206229` ValueError ` bývá často správná volba.
0 commit comments