Python Try Except: Vysvětleno s příklady

Python Try Except je konstrukce používaná v Pythonu k elegantnímu zpracování výjimek bez zhroucení.

Díky zpracování výjimek je váš programový kód spolehlivější a méně pravděpodobné, že selže. Tento článek popisuje zpracování výjimek a běžné scénáře, ve kterých je zpracování výjimek ideální. Jako bonus také probereme, jak udělovat výjimky.

Co je zpracování výjimek?

Výjimkou jsou kritické anomálie a chyby, které vznikají během provádění programu. Pokud nebude zpracována, výjimky způsobí pád programu. Zpracování výjimek je tedy způsob, jak zpracovat výjimky, aby se zajistilo, že nezpůsobí pád programu.

Zde je příklad pro ilustraci toho, co je výjimka.

user_input = input("Enter a number: ")
num = int(user_input)
print("Your number doubled is:", num * 2)

Na první pohled se zdá, že s výše uvedeným programem není nic špatného. Přijímá vstup od uživatele a převádí jej na celé číslo. Dále zobrazí celé číslo poskytnuté uživatelem zdvojnásobené.

Program běží dobře, pokud jej spustíte se vstupní hodnotou 5. Viz níže.

Ale předpokládejme, že jste znovu spustili stejný program. Pouze tentokrát místo použití 5 jako vstupu zadáte řetězec „ahoj“. Program se zhroutí. Řetězec „ahoj“ nelze převést na celé číslo, takže je vyvolána výjimka a program se zhroutí.

Proč se objevují výjimky a proč byste je měli řešit?

Výjimky jsou uvedeny, protože programy často při kódování rozkládáme na funkce. Tyto funkce jsou pak volány k provádění různých úkolů.

Ve výše uvedeném příkladu jsme zavolali vstupní funkci pro příjem uživatelského vstupu, pak jsme zavolali funkci int, abychom převedli vstupní řetězec na celé číslo, a nakonec jsme zavolali funkci print, abychom zobrazili nějaký výstup.

Když však funkce provádějí své činnosti, mohou narazit na chyby, se kterými si nevědí rady. V tomto případě se musí uvedené funkce zastavit a oznámit, že došlo k chybě. Pro komunikaci budou upozorňovat na výjimky.

  Jak nahrávat vysoce kvalitní podcasty a videa pomocí Waveroom

Kód, který se nazývá funkce, je zodpovědný za naslouchání těmto výjimkám a odpovídající reakci. Pokud tak neučiníte, program se po zjištění chyb zhroutí, jak jsme viděli v předchozím příkladu.

Výjimky jsou tedy v podstatě komunikačním mechanismem, který umožňuje funkci, která byla volána, vyslat nouzový signál do kódu, který ji zavolal. A reakce, o které jsme se již zmiňovali, je podstatou zpracování výjimek.

Různé druhy výjimek

Je důležité vědět, že ne všechny výjimky jsou stejné. Pro různé zjištěné chyby existují různé druhy výjimek. Pokud se například pokusíte vydělit číslo nulou, vyvolá se chyba ZeroDivisionError. A při pokusu o operaci s neplatným datovým typem se vyvolá chyba TypeError. Zde je kompletní seznam typy výjimek.

Jak zacházet s výjimkami

Jak bylo vysvětleno dříve, výjimkou jsou tísňové signály vytvářené funkcemi, které nazýváme. Náš kód by proto měl naslouchat těmto tísňovým signálům a přiměřeně reagovat, když zazní. Pro správné zpracování výjimek používáme konstrukty Python Try Except. Základní struktura konstrukce je následující:

try:
    # Code to try and run
except:
    # Code to run if an exception is raised
finally:
    # Code to run in the end, whether or not an exception is raised

Jak vidíte, konstrukce se skládá ze tří klíčových slov, která jsou vysvětlena níže:

Snaž se

Klíčové slovo try označuje začátek konstrukce Try Except v Pythonu. Navíc označuje blok kódu, který by mohl potenciálně vyvolat výjimku. Je to instrukce pro interpret Pythonu, aby se pokusil spustit kód v bloku. Pokud je vyvolána výjimka, program se okamžitě zastaví a skočí ke spuštění kódu napsaného uvnitř bloku výjimkou.

až na

Klíčové slovo výjimkou označuje blok kódu, který bude proveden, pokud je při provádění bloku try vyvolána výjimka. Můžete definovat více bloků kromě pro různé typy výjimek, které by mohly být vyvolány. To bude ilustrováno později.

Konečně

Klíčové slovo nakonec je třetí a poslední klíčové slovo použité v Pythonu Try Except. Označuje blok kódu, který bude proveden bez ohledu na to, zda je vyvolána výjimka.

Příklad

Zde je příklad toho, jak výše uvedená klíčová slova zvládnou výjimku. Upravíme na to předchozí příklad.

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except:
    print("Something went wrong")
finally:
    print("This code will be executed no matter what")

Pokud výše uvedený kód spustíte s 5, platným vstupem, získáte následující:

  15 věcí, o kterých jste nevěděli, že můžete dělat na Instagramu

A pokud jej spustíte se vstupem „ahoj“, získáte následující:

Takže když při provádění kódu v bloku try nebyla vyvolána žádná výjimka, počítač se přesunul do bloku konečně. Když však byla vyvolána výjimka při provádění kódu v bloku try, počítač se přesunul do bloku výjimkou a poté do bloku konečně.

Můžete také zpracovat výjimky pro konkrétní druhy chyb. Pokud například chcete zpracovat výjimky ValueError a KeyboardInterrupt specifickým způsobem, můžete výše uvedený kód upravit takto:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError:
    print("Value can't be converted to int")
except KeyboardInterrupt:
    print("Received a keyboard interrupt")
except:
    print("Catch-all exception block")
finally:
    print("This code will be executed no matter what")

Ve výše uvedeném kódu máme 3 kromě bloků. První kromě bloku zachycuje pouze výjimky ValueError, zatímco druhý pouze zachycuje výjimky KeyboardInterrupt. Poslední blok kromě nemá přidružený typ výjimky, který by bylo možné naslouchat. Výsledkem je, že zachytí zbytek výjimek, které první dva bloky nezachytí.

Spuštěním výše uvedeného kódu byste měli získat výstup podobný tomuto:

Když je vyvolána výjimka, můžete získat další informace o výjimce v objektu výjimky. Chcete-li získat přístup k objektu výjimky, použijte klíčové slovo as. Používá se následovně:

try:
    user_input = input("Enter a number: ")
    num = int(user_input)
    print("Your number doubled is:", num * 2)
except ValueError as e:
    print("Value Error:", e)
except KeyboardInterrupt as e:
    print("Keyboard Interrupt:", e)
except Exception as e:
    print("Some other exception", e)

Jak udělovat výjimky

Doposud jsme se potýkali s výjimkami vyvolanými jinými funkcemi. Je však také možné, abyste ve svém kódu vyvolali výjimky. K vyvolání výjimky používáme klíčové slovo raise. Určujeme také třídu, která představuje, jaký typ výjimky chceme vyvolat, a lidsky čitelnou zprávu spojenou s výjimkou.

V následujícím příkladu používáme třídu Exception k vyvolání obecné výjimky. Dále předáme zprávu konstruktoru třídy.

raise Exception('Something went wrong')

Pokud výše uvedený úryvek spustíte jako program, získáte výstup podobný tomuto:

  Jak změnit e-mailovou adresu Slack

Můžete také zadat různé druhy výjimek. Můžete například vyvolat výjimku TypeError, když má hodnota nesprávný datový typ:

def double(x):
    if isinstance(x, int):
        return x * 2
    else
        raise TypeError('x should be an int')

Nebo pokud je zadaná hodnota mimo přijatelné hranice, můžete vyvolat hodnotu ValueError:

def say_hello(name):
    if name == '':
        raise ValueError('Value outside bounds')
    else:
        print('Hello', name)

Můžete také vytvořit své typy výjimek podtřídou třídy Exception. Zde je příklad:

class InvalidHTTPMethod(Exception):
    pass

Ve výše uvedeném příkladu jsme vytvořili třídu InvalidHTTPMethod, která dědí z třídy Exception. Můžeme jej použít stejným způsobem jako dříve k vyvolání výjimek:

raise InvalidHTTPMethod('Must be GET or POST')

Běžné případy použití pro zpracování výjimek

Zpracování výjimek se používá v mnoha scénářích. Předchozí příklad ukázal, jak dokáže zpracovat výjimky způsobené vstupem uživatele. Tato část se bude zabývat dvěma dalšími situacemi, kdy je užitečné zpracování výjimek. Jedná se o zpracování výjimek v důsledku neúspěšných síťových požadavků a zpracování výjimek při čtení souborů.

Vytváření síťových požadavků

V níže uvedeném příkladu odesíláme požadavek společnosti Google. Posloucháme výjimky, abychom je zvládli. Tyto výjimky jsou definovány v objektu request.exceptions.

import requests

try:
    response = requests.get("https://google.com")

    # Check if the response status code is in the 200-299 range (successful response)
    if 200 <= response.status_code < 300:
        print("Request was successful!")
    else:
        print(f"Request failed with status code: {response.status_code}")
except requests.exceptions.RequestException as e:
    print(f"RequestException occurred: {e}")
except requests.exceptions.ConnectionError as e:
    print(f"ConnectionError occurred: {e}")
except requests.exceptions.Timeout as e:
    print(f"Timeout occurred: {e}")
except requests.exceptions.TooManyRedirects as e:
    print(f"TooManyRedirects occurred: {e}")
except requests.exceptions.HTTPError as e:
    print(f"HTTPError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Čtení dat ze souboru

V tomto posledním příkladu čteme data ze souboru hello.txt. Zpracováváme také běžné výjimky, které mohou být vyvolány, jako je chyba FileNotFound a IOError.

try:
    with open(file_path, 'r') as file:
        data = file.read()
        print("File contents:")
        print(data)
except FileNotFoundError as e:
    print(f"FileNotFoundError occurred: {e}")
except IOError as e:
    print(f"IOError occurred: {e}")
except Exception as e:
    print(f"An unexpected error occurred: {e}")

Závěr

Tento článek prozkoumal, jaké výjimky to byly a proč byly vzneseny. Zjistili jsme také, že s nimi nakládáme, abychom kód učinili spolehlivějším a zabránili padání. Nakonec jsme se zabývali tím, jak zacházet s výjimkami a jak některé výjimky vyvolávat.

Dále se podívejte na běžné typy chyb Pythonu a na to, jak je vyřešit.