Jak zachytit více výjimek v Pythonu: Snadný průvodce

Chytání výjimek v Pythonu pomáhá zajistit, že vaše programy budou padat méně často. Díky tomu je váš kód spolehlivější a poskytuje lepší uživatelský dojem. V tomto článku budu diskutovat o tom, jak zachytit více výjimek ve stejném bloku try/except v Pythonu.

Jaké jsou výjimky v Pythonu?

v Krajta, Výjimky jsou komunikační mechanismus mezi různými částmi programu. Tento komunikační mechanismus umožňuje jedné části systému sdělit, že se setkala s kritickou chybou, se kterou si neví rady.

Takže vyvolává výjimku. Další část programu, která ví, jak s chybou zacházet, výjimku zachytí a chybu správně zpracuje.

Pokud se s výjimkami nepracuje, dojde ke zhroucení programu. Zpracování výjimek tedy zabrání pádu vašeho programu a zvýší jeho spolehlivost.

U tohoto článku předpokládám, že jste již obeznámeni se základy nastavování a zpracování výjimek, které jsou popsány v tomto článku Úvod do Pythonu Try/Except.

Důležitost zpracování více výjimek v Pythonu

  • Snižuje duplicitu kódu, protože více výjimek zpracovává stejný blok. To usnadňuje čtení, úpravy a mazání kódu.
  • Pomáhá vám také psát efektivnější kód, protože typ chyby je třeba kontrolovat pouze jednou místo několikrát.
  Jak psát do PDF v roce 2022

Zpracování více výjimek

Chytání více výjimek se týká situace, kdy je zachyceno více výjimek pomocí stejného bloku kromě. V Pythonu můžete zachytit různé výjimky v jednotlivých blocích kromě.

Případně, pokud chcete výjimky zpracovat podobným způsobem, můžete je zpracovat pomocí jednoho bloku. Chcete-li tak učinit, budete muset zachytit několik výjimek. V této části vysvětlím, jak to udělat na příkladu.

#1. Chytání různých výjimek v různých blocích

Předpokládejme, že máme program navržený tak, aby přijal dvě různé hodnoty a rozdělil je. V tomto programu předpokládáme, že když uživatel zadá neplatné hodnoty, budou vyvolány různé typy výjimek. Zejména chceme zpracovat ValueError a ZeroDivisionError.

Hodnota ValueError bude vyvolána, když uživatel zadá hodnotu, kterou nelze převést na celé číslo. Chyba ZeroDivisionError se vyvolá, když je druhé číslo nula. V obou těchto případech chceme zobrazit chybovou zprávu, která říká: „Zadali jste neplatnou hodnotu“.

Chcete-li provést výše uvedené, můžeme napsat následující kód:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except ValueError as e:
    print("You entered an invalid value")
except ZeroDivisionError as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

Pokud spustíme výše uvedený kód a text, který nelze převést na celé číslo, bude to výsledek:

  Zakázat úvodní obrazovku MS Office 2013 a vždy otevírat prázdné dokumenty

A pokud bychom zadali druhé číslo jako 0, byl by výsledek:

Kód funguje podle očekávání, ale všimněte si, že s ValueError a ZeroDivisionError nakládáme podobně. Mezi dvěma bloky Except tedy existuje mnoho duplikací kódu. To není ideální, protože při programování porušujeme princip DRY. Princip DRY říká Neopakuj se.

Takže místo samostatného psaní kódu můžeme spojit dva bloky do jednoho bloku, který zachytí více výjimek. Pokud tak učiníme, vyvarujeme se opakování.

#2. Chytání více výjimek v jednom bloku kromě

Pro zachycení více výjimek poskytujeme n-tici, která specifikuje všechny chyby, které chceme zachytit. Zde je příklad, kdy zachytíme ValueError i ZeroDivisionError v jednom bloku kromě:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")
except Exception as e:
    print("Something went wrong")

Toto je mnohem lepší implementace než předchozí kód. V podstatě o tom je zpracování více výjimek. Výše uvedený kód funguje stejným způsobem jako dříve. Pokud testujete pomocí předchozích příkladů, mělo by to fungovat jako dříve:

#3. Identifikace, která výjimka byla zachycena

Výše uvedený kód provede první blok kromě, když byla zachycena hodnota ValueError nebo ZeroDivisionError. V některých případech můžete mít kód, který chcete spustit pro obě chyby, a nějaký další kód, který chcete spustit pro jednu, ale ne pro druhou chybu.

  Jak sledovat kontakt Skype

V tomto případě musíte nejprve zjistit, jaká chyba byla zachycena, a spustit příslušný kód.

Chcete-li zjistit, která výjimka byla zachycena, můžete použít blok if/else uvnitř bloku výjimkou. Například:

try:
    dividend = int(input('Enter first num: '))
    divisor = int(input('Enter second num: '))
    quotient = dividend / divisor
    print(quotient)
except (ValueError, ZeroDivisionError) as e:
    print("You entered an invalid value")

    if isinstance(e, ValueError):
        print('Value Error')
    else:
        print('Zero Division Error')
except Exception as e:
    print("Something went wrong")

V tomto bloku kromě tisku obecné chybové zprávy pro ValueError i ZeroDivisionError také přesně kontrolujeme, jaký typ chyby jsme zachytili, a tiskneme další zprávu. Pokud kód znovu otestujeme, měli bychom vidět nějaké další zprávy specifické pro zachycenou výjimku.

Kdy byste chtěli řešit více výjimek?

V obecném případě je zpracování více výjimek ideální, když chcete spustit stejný kód pro podobné výjimky, které by mohly být vyvolány. To zahrnuje následující:

  • Síťové požadavky, které se nezdařily z různých důvodů. Bez ohledu na to můžete uživatele upozornit, že server není dostupný.
  • Selhala databázová připojení, která způsobují více chyb. I když se tyto chyby mohou lišit, vaše zpracování může být stejné.
  • Soubor I/O také vytváří chyby, které lze řešit podobně, jako jsou chyby oprávnění a plného disku.

Závěr

Tento článek pojednával o kombinování více bloků kromě do jednoho zachycením více výjimek současně. Díky tomu bude váš kód čitelnější a udržitelnější. Dále si možná budete chtít přečíst tento článek o projektech Python pro začátečníky, které byste měli vyzkoušet.