Mikuláš je tu! Získaj 90 % extra kreditov ZADARMO s promo kódom CERTIK90 pri nákupe od 1 199 kreditov. Len do nedele 7. 12. 2025! Zisti viac:
NOVINKA: Najžiadanejšie rekvalifikačné kurzy teraz s 50% zľavou + kurz AI ZADARMO. Nečakaj, táto ponuka dlho nevydrží! Zisti viac:

Diskusia – 18. diel - Funkcie a výnimky v Pythone

Späť

Upozorňujeme, že diskusie pod našimi online kurzami sú nemoderované a primárne slúžia na získavanie spätnej väzby pre budúce vylepšenie kurzov. Pre študentov našich rekvalifikačných kurzov ponúkame možnosť priameho kontaktu s lektormi a študijným referentom pre osobné konzultácie a podporu v rámci ich štúdia. Toto je exkluzívna služba, ktorá zaisťuje kvalitnú a cielenú pomoc v prípade akýchkoľvek otázok alebo projektov.

Komentáre
Posledné komentáre sú na spodnej časti poslednej stránky.
Avatar
DarkCoder
Člen
Avatar
Odpovedá 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.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá 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)
Avatar
DarkCoder
Člen
Avatar
Odpovedá 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ší.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá 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.

Avatar
DarkCoder
Člen
Avatar
Odpovedá 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.

Odpovedať
"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.

Avatar
DarkCoder
Člen
Avatar
Odpovedá 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ší.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovedá 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.

Avatar
DarkCoder
Člen
Avatar
Odpovedá 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.

Odpovedať
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Karel Zaoral
Člen
Avatar
Odpovedá 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.

Posledné komentáre sú na spodnej časti poslednej stránky.
Robíme čo je v našich silách, aby bola tunajšia diskusia čo najkvalitnejšia. Preto do nej tiež môžu prispievať len registrovaní členovia. Pre zapojenie sa do diskusie sa zaloguj. Ak ešte nemáš účet, zaregistruj sa, je to zadarmo.

Zobrazené 10 správy z 124.