NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Funkce, kterou se snažíš použít je dostupná pouze pro registrované uživatele. Buďto se přihlas nebo si zdarma vytvoř nový účet.

Diskuze – Lekce 18 - Funkce a výjimky v Pythonu

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Salvet
DarkCoder:4.7.2023 2:25

Odchycení konkrétních výjimek je výhodné, pokud chceme provést odlišné reakce na základě typu výjimky.

Pokud použijeme obecnou výjimku, jako je Exception nebo BaseException, budou zachyceny všechny výjimky, a to včetně těch, které bychom možná chtěli speciálně zpracovat. To může vést k nevhodnému chování programu.

Podívej se na následující úryvek programu:

MAX_VALUE = 255

def get_8bit_number():
    try:
        number = int(input("Zadejte číslo (8 bitů): "))
    except ValueError:
        print("Neplatný vstup!")
        exit(1)
    try:
        if number < 0 or number > MAX_VALUE:
            raise OverflowError("Překročení rozsahu 8 bitů")
        return number
    except OverflowError:
        return MAX_VALUE

input_number = get_8bit_number()
print("Zadané číslo:", input_number)

Díky zachytávání konkrétních výjimek můžeme provádět adekvátní chování programu.

Při neplatném vstupu se vypíše hláška a ukončí se program. Při zadaném číslu mimo rozsah se vrátí maximální hodnota. Jinak se vrátí zadaná hodnota.

Chování programu pro různé výjimky je odlišné. Nyní bys měl porozumět smyslu zachytávání konkrétních výjimek.

Odpovědět
4.7.2023 2:25
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Salvet:4.7.2023 10:04

Ahoj diky za vysvetelneni ktere dava a zatim i nedava smysl. Asi jeste nejsem tak daleko abych videl prinos vychytavani jednotlivych vyjimek timto zpusobem. Ale mozna az budu pokrocilejsi tak mi to bude davat smysl. Treba tvuj kod bych napsal takto, cimz bych neresil kokretni typy chyb.

MAX_VALUE = 255

def get_8bit_number():
    try:
        number = int(input("Zadejte číslo (8 bitů): "))
    except:
        print("Neplatný vstup!")
        exit(1)
    else:
        if number < 0 or number > MAX_VALUE:
            return MAX_VALUE
        else:
            return number

input_number = get_8bit_number()
print("Zadané číslo:", input_number)
 
Odpovědět
4.7.2023 10:04
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Salvet
DarkCoder:4.7.2023 11:39

Ano, i takto by se to dalo napsat. Předchozí příklad nebyl ideální. Obecně, to co potřebuješ posoudit je, zda program potřebuje provést odlišnou činnost při zachycení různých výjimek. Zde je jiný, lepší příklad, na nutnost odchytávání konkrétních výjimek:

def process_file(filename):
    try:
        # Otevření souboru pro čtení
        file = open(filename, "r")

        # Provádění operací se souborem

        # Zavření souboru
        file.close()

    except FileNotFoundError:
        print("Soubor neexistuje!")
        try:
            # Otevření souboru recovery.txt pro čtení
            recovery_file = open("recovery.txt", "r")

            # Provádění operací se souborem recovery.txt

            # Zavření souboru recovery.txt
            recovery_file.close()

        except Exception as e:
            print("Chyba se souborem recovery.txt:", str(e))
            exit(1)

    except PermissionError:
        print("Nemáte oprávnění k přístupu ke souboru!")
        exit(1)
    except IOError:
        print("Chyba při čtení/zápisu do souboru!")
        exit(1)
    except Exception as e:
        print("Neočekávaná chyba:", str(e))
        exit(1)

# Příklad použití
filename = "example.txt"
process_file(filename)

Program se pokusí provést operace na souborem example.txt. Pokud neexistuje, provedou se operace nad záložním souborem recovery.txt. Pokud existuje, řeší se další možné příčiny chyb. V těchto případech to řešíme ukončením programu. Pokud vše je v pořádku, program provede co má, nad souborem example.txt. Pokud operujeme nad souborem recovery.txt, zajímá nás už jen to zda došlo k chybě či nikoli. To můžeme brát jako kritickou situaci a stačí nám obecné odchycení výjimky pro ukončení programu (Můžeme samozřejmě konkretizovat odchyt pro bližší zjištění chyby).

Chování při chybě je zde odlišné. Náhrada souboru example.txt za recovery.txt může být důležitá. Proto to odchycení konkrétní výjimky. Kdežto selhání operace nad recovery.txt už můžeme řešit obecnou výjimkou vedoucí k ukončení programu. Snad je nutnost odchycení konkrétní výjimky srozumitelnější.

Odpovědět
4.7.2023 11:39
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Salvet:4.7.2023 19:32

JJ diky tady uz je videt prinos. Pusobi to na mne jako takove sofistikovanejsi podminky (if, elif, else) Pokud ale nebudeme nutne potrebovat adresovat nejaky konkretni typ chyby tak mi porad vychazi lepe tu chybu nespecifikovat a jak uvadis, ze nam staci obecne odchyceni, kdezto clanek nas pred timto varuje coz se mi prave moc nezda, ze by to melo byt nejak spatne nebo ze by kod byl nejak mene robustni, protoze pokud budeme potrebovat adresovat konkretni chybu tak to proste musime udelat. Spis mi pripada ze kod adresovanim konkretni chyby, pokud to nepotrebujeme je mene robustni, protoze co kdyz se vyskytne chyba kterou jsme nespecifikovali? Kazdopadne pekne vysvetleni.

 
Odpovědět
4.7.2023 19:32
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Salvet
DarkCoder:4.7.2023 21:40

Ano, je tu určitá podobnost s příkazem switch, kde pro výjimky jsou vyhrazena ID vyhodnocující se nad příslušným case s příkazem break. Je to takové zautomatizovani získání příčiny chyb, kde si určujete stupeň automatizace mezi dvěma stavy.

Na jedné straně je robustnost, kdy v případě odchyceni výjimky program nespadne. To je u odchyceni libovolné výjimky. Na druhé straně je schopnost identifikovat a opravit chybu. To je u konkrétní výjimky. Je třeba bavit rovnováhu mezi těmito dvěma stavy.

Pokud se za.erime pouze na odchyceni.konkretni výjimky, může program spadnout pokud nastane jiná výjimka která není.odchycena. pokud se ale očekává jen tato výjimka, program buse rychlejší a snáze se identifikuje chyba. V případě odchyceni obecné výjimky je robustnost vyšší, ale je třeba tuto výjimku řádně ošetřit. Program bude pomalejší, neboť se zjišťuji všechny možné výjimky které mohou nastat.

Je na programátorovi, aby zvolí způsob zachycení výjimky. Obecně se to řeší tak, že musí s citem posoudit jaká výjimka může nastat a poté přidat odchyceni libovolné výjimky.

Odpovědět
4.7.2023 21:40
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Michal Salvet:5.7.2023 9:26

Musim pochvalit uz trosku slozitejsi ale pekna lekce. Na zaver nice touch uzavreni uz tak kratkeho kodu do jedne funkce. Mam akdemickou otazku. Premyslel jsem jestli ve funkci volba() muze nastat posledni kondice else. Na nic jsem neprisel, ale je jasne ze tato cast kodu je dulezita, urcite bych ji tam dal taky.

 
Odpovědět
5.7.2023 9:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Salvet
DarkCoder:5.7.2023 10:43

Samozřejmě že část else může nastat. Pro výběr operace jsou povolena celá čísla <1,5> kdežto funkce funguje napříč reálnými čísly bez stanoveného rozsahu. Hodnoty jako 0, 12, 2.5 jsou neplatné a větev s else je zachytí. Část s else je tedy důležitá zvláště když se předtím neprovádí test na platnou hodnotu. Jinak celý program se skládá ze tří částí:

  1. Načtení čísel
  2. Volba operace
  3. Zpracování operace

Při pohledu na hlavní funkci není jasné, oč tam jde.. Dokonce to budí dojem že tam něco chybí. Mnohem lepší je rozdělit funkci volba do dvou funkcí, viz. body 2 a 3. Program se stane mnohem srozumitelnější.

Odpovědět
5.7.2023 10:43
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Michal Salvet:5.7.2023 13:44

No jasne na hodnoty cisel jsem nepomyslel, ze tam neni zadna kondice ktera by to osetrila. Nejak jsem premyslel jen nad integer vs dalsi data typy coz se odfiltrovalo uz predtim.

 
Odpovědět
5.7.2023 13:44
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Salvet
DarkCoder:5.7.2023 14:08

Používat funkci nacti_cislo() vracející float pro operace nad celými čísly ve funkci volba() není dobrý způsob programování.

Mnohem lepší je ošetřit vstup na validni ihned po zadání, než pak překvapit uživatele neplatnou volbou.

Odpovědět
5.7.2023 14:08
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Karel Zaoral
Člen
Avatar
Odpovídá na Jan Daliba
Karel Zaoral:14.7.2023 1:18

Ahoj, jednoduše:

try:
    # kód, který může vyvolat výjimku
except Exception as e:
    print("Došlo k výjimce: ", str(e))

V tomto případě klíčové slovo Exception zachytává všechny výjimky, které mohou být vyvolány v bloku try. A as e pak umožňuje přistupovat k zachycené výjimce.

 
Odpovědět
14.7.2023 1:18
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 118.