ošetření chyby

36 views
Skip to first unread message

jan kotrba

unread,
Sep 29, 2020, 8:13:31 AM9/29/20
to django-cs
Ahoj,

jsem začátečník, proto prosím pomalu na mě :-)

Dostal jsem se na https://naucse.python.cz/course/pyladies/beginners/exceptions/ a v kódu níže bych rád ošetřil proměnou cislo, aby při vstupu třeba "h" místo "5" na mě vyskočilo "To není číslo".

Jak na to? Díky předem za tipy.

tajne_cislo = 4
pocet_hadani = 0


for pocet_hadani in range(3):
cislo = int(input("Hádej číslo: "))
pocet_hadani += 1
if cislo == tajne_cislo:
print("Vyhrál jsi!")
break
else:
print("Prohrál jsi!")

Martin Kubát

unread,
Sep 29, 2020, 8:27:08 AM9/29/20
to djan...@googlegroups.com
Ahoj,
k načtení čísla dochází na tomto řádku:
cislo = int(input("Hádej číslo: "))
tak bych se zde soustředil na to, abys obalil tento kousek kódu výjimkou.

MK


út 29. 9. 2020 v 14:13 odesílatel jan kotrba <jan.ko...@gmail.com> napsal:
--
--
E-mailová skupina djan...@googlegroups.com
Správa: http://groups.google.cz/group/django-cs
---
Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny „django-cs“ ve Skupinách Google.
Chcete-li zrušit odběr skupiny a přestat dostávat e‑maily ze skupiny, zašlete e-mail na adresu django-cs+...@googlegroups.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/eb704c4b-568a-4329-81dc-b33f13381941o%40googlegroups.com.

Petr Messner

unread,
Sep 29, 2020, 8:39:16 AM9/29/20
to djan...@googlegroups.com
image.png

út 29. 9. 2020 v 14:13 odesílatel jan kotrba <jan.ko...@gmail.com> napsal:
Ahoj,

--

jan kotrba

unread,
Sep 29, 2020, 10:00:11 AM9/29/20
to django-cs
Když napíšu tohle:

tajne_cislo = 4
pocet_hadani = 0


for pocet_hadani in range(3):
    try:

        cislo = int(input("Hádej číslo: "))
    except ValueError:
        print("Tohle není číslo!")

    pocet_hadani += 1
    if cislo == tajne_cislo:
        print("Vyhrál jsi!")
        break
else:
    print("Prohrál jsi!")

a při prvním hádání zadám "a", dostanu

Hádej číslo: a
Tohle není číslo!
Traceback (most recent call last):
  File "C:/Users/PycharmProjects/HelloWorld/hadej_cislo.py", line 11, in <module>
    if cislo == tajne_cislo:
NameError: name 'cislo' is not defined

A jak mám ošetřit chybu v podmínce zatím nevím :-(



Dne úterý 29. září 2020 v 14:27:08 UTC+2 uživatel mar....@gmail.com napsal:

Martin Kubát

unread,
Sep 29, 2020, 10:06:24 AM9/29/20
to djan...@googlegroups.com
Tak napr.

# ...
for pocet_hadani in range(3):
    try:
        cislo = int(input("Hádej číslo: "))
    except ValueError:
        print("Tohle není číslo!")
        cislo = None
# ...

út 29. 9. 2020 v 16:00 odesílatel jan kotrba <jan.ko...@gmail.com> napsal:

Petr Messner

unread,
Sep 29, 2020, 10:27:45 AM9/29/20
to djan...@googlegroups.com
Musíš ten input opakovat. 


for pocet_hadani in range(3):
    while True:
        try:
            cislo = int(input("Hádej číslo: "))
            break
        except ValueError:
            print("Tohle není číslo!")
    if cislo == tajne_cislo:
        print("Vyhrál jsi!")
        break




út 29. 9. 2020 v 16:00 odesílatel jan kotrba <jan.ko...@gmail.com> napsal:

jan kotrba

unread,
Sep 29, 2020, 11:49:05 AM9/29/20
to django-cs
Díky, rozumím.
Přesně toto jsem chtěl :-)

Dne úterý 29. září 2020 v 16:27:45 UTC+2 uživatel Messa napsal:

Petr Viktorin

unread,
Sep 29, 2020, 4:14:03 PM9/29/20
to jan.ko...@gmail.com, djan...@googlegroups.com

Jinak v podobných situacích doporučuju sednout a projít program řádek po
řádku, tak jak ho Python vykonává. Občas se tak chyba dá najít.
(A občas taky ne a je rozumné se zeptat ☺)


On 2020-09-29 16:00, jan kotrba wrote:
...
> for pocet_hadani in range(3):

OK, budu opakovat třikrát. Jdu poprvé; do `pocet_hadani_ přiřadím 0 a
pokračuju:

>     try:

OK, tady bude něco co se nemusí povést.

>         cislo = int(input("Hádej číslo: "))

OK, vyhodnotím výraz za závorkou a výsledek přiřadím do proměnné.
První vyhodnotím výraz v závorkách čili `input("Hádej číslo: ")`, volání
funkce `input`. Zeptám se tedy uživatele "Hádej číslo: " a počkám si na
odpověd...

... Odpověděl "a", což dosadím místo `input("Hádej číslo: ")`, a
pokračuju ve vyhodnocování výrazu: `int("a")`. Převedu tedy "a" na číslo...
Ale ouvej, to nejde! Nastala chyba, takže přestanu provádět zbytek bloku
`try` a skočím na příslušný `except`.
(pozn. zbytek příkazu, tedy přiřazení do `cislo`, se neprovede – ani
nemůže, není k dispozici žádná hodnota, co by se té proměnné přiřadila.)

>     except ValueError:

Ten je hned tady! Tak začnu:

>         print("Tohle není číslo!")

OK, volání funkce `print`; vypíšu `"Tohle není číslo!"`.
Tím blok `except` končí, takže pokračuju dál.

>     pocet_hadani += 1

K `pocet_hadani` (aktuálně 1) přičtu 1, nová hodnota je tedy 1.
(pozn. tohle není potřeba, postará se o to cyklus `for`.)

>     if cislo == tajne_cislo:

OK, porovnám hodnotu `cislo` s `tajne_cislo`.
Ale ouvej! Do proměnné `cislo` ještě není nic přiřazené!
A ani nejsem v bloku `try`, tak ukončím program s chybovou hláškou.
Reply all
Reply to author
Forward
0 new messages