Skip to content

Commit c077ab2

Browse files
committed
beginners/exceptions: Note on isnumeric & more rewordings
1 parent 3def8de commit c077ab2

1 file changed

Lines changed: 35 additions & 12 deletions

File tree

lessons/beginners/exceptions/index.md

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
Pojď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
99
def nacti_cislo():
@@ -22,7 +22,7 @@ Traceback (most recent call last):
2222
ValueError: 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.
2626
Co s tím má chudák funkce `int` dělat?
2727
Není žádná rozumná hodnota, kterou by mohla vrátit.
2828
Př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.
5050
A 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+
101121
Když odchytáváš obecnou výjimku,
102122
chytnou se i všechny podřízené typy výjimek –
103123
například `except ArithmeticError:` zachytí i `ZeroDivisionError`.
@@ -110,21 +130,24 @@ Většinu chyb *není* potřeba ošetřovat.
110130

111131
Nastane-li *nečekaná* situace, je téměř vždy
112132
mnohem 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.
114134
Navíc chybový výstup, který Python standardně
115135
připraví, může hodně ulehčit hledání chyby.
116136

117137
Zachytávej tedy jenom ty chyby, které *očekáváš* – víš přesně, která chyba může
118138
nastat 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

122144
Co ale dělat, kdyš uživatel chce ukončit program a zmáčkne
123145
<kbd>Ctrl</kbd>+<kbd>C</kbd>?
124146
Nebo 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

179202
Když někdo zavolá `obsah_ctverce(-5)`, *neexistuje* správný výsledek, který by
180203
funkce 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*.
182205
S tou se pak může program, který `obsah_ctverce(-5)` zavolal,
183206
vypořádat – vynadat uživateli, zkalibrovat měřák, nebo, pokud na chybu není
184207
př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
192215
def 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

199222
Podobně 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ý,
201224
ukončí 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ý.
205228
Klidně „střílej od boku“.
206229
`ValueError` bývá často správná volba.

0 commit comments

Comments
 (0)