Python Try Kivéve: Példákkal magyarázva

A Python Try Except egy olyan konstrukció, amelyet a Python használ a kivételek kecses kezelésére, összeomlás nélkül.

A kivételkezelés megbízhatóbbá teszi a programkódot, és kevésbé valószínű, hogy meghibásodik. Ez a cikk bemutatja a kivételek kezelését és azokat a gyakori forgatókönyveket, amelyekben a kivételkezelés ideális. Bónuszként kitérünk arra is, hogyan emelhetünk ki kivételeket.

Mi az a kivételkezelés?

A kivételek a kritikus anomáliák és hibák, amelyek a program végrehajtása során merülnek fel. Ha nem kezelik, a kivételek összeomlik a program. Ezért a kivételkezelés a kivételek kezelésének módja annak biztosítása érdekében, hogy azok ne okozzák a program összeomlását.

Íme egy példa, amely bemutatja, mi a kivétel.

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

Első pillantásra úgy tűnik, hogy a fenti programmal nincs semmi baj. Bemenetet kap a felhasználótól, és egész számmá alakítja. Ezután a felhasználó által megadott egész számot duplázva jeleníti meg.

A program jól fut, ha 5-ös bemeneti értékkel futtatja. Lásd alább.

De tegyük fel, hogy újra futtatta ugyanazt a programot. Csak ezúttal az 5 helyett írja be a „hello” karakterláncot. A program összeomlik. A „hello” karakterlánc nem konvertálható egész számmá, ezért kivétel keletkezik, és a program összeomlik.

Miért vannak kivételek, és miért kell kezelni őket?

Kivételek merülnek fel, mert a programokat gyakran függvényekre bontjuk kódolásuk során. Ezeket a funkciókat ezután különböző feladatok végrehajtására hívják.

A fenti példában a bemeneti függvényt meghívtuk a felhasználó bevitelének fogadására, majd az int függvényt, amely a karakterlánc bemenetét egész számmá alakítja, végül pedig a print függvényt, hogy megjelenítsen valamilyen kimenetet.

A funkciók végrehajtása során azonban olyan hibákkal találkozhatnak, amelyeket nem tudnak kezelni. Ebben az esetben az említett funkcióknak le kell állniuk, és közölniük kell, hogy hiba történt. A kommunikációhoz kivételeket fognak felhozni.

A függvénynek nevezett kód felelős a kivételek figyeléséért és a megfelelő reagálásért. Ha ez nem történik meg, a program összeomlik, miután hibákat észlel, amint azt a korábbi példában láttuk.

  5 megbízható MEAN Stack hosting platform

Ezért a kivételek lényegében olyan kommunikációs mechanizmusok, amelyek lehetővé teszik, hogy egy meghívott függvény vészjelzést küldjön az őt hívó kódnak. A kivételkezelés lényege pedig a korábban utalt megfelelő reagálás.

Különféle kivételek

Fontos tudni, hogy nem minden kivétel egyforma. Különböző típusú kivételek merülnek fel a felmerült hibákra. Például, ha megpróbál egy számot nullával osztani, akkor a ZeroDivisionError jelzés jelenik meg. És egy TypeError jelenik meg, ha érvénytelen adattípussal próbál meg végrehajtani. Itt van a teljes lista típusú kivételek.

Hogyan kezeljük a kivételeket

Amint azt korábban kifejtettük, a kivételek az általunk meghívott függvények által adott vészjelzések. A kódunknak ezért figyelnie kell ezeket a vészjelzéseket, és megfelelően reagálnia kell, amikor megszólalnak. A kivételek megfelelő kezeléséhez Python Try Except konstrukciókat használunk. A konstrukció alapvető felépítése a következő:

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

Amint láthatja, a konstrukció három kulcsszóból áll, amelyeket alább ismertetünk:

próbáld ki

A try kulcsszó egy Python Try Except konstrukció kezdetét jelöli. Ezenkívül megjelöl egy kódblokkot, amely potenciálisan kivételt jelenthet. Ez egy utasítás a Python értelmezőnek, hogy próbáljon meg kódot futtatni a blokkban. Kivétel esetén a program azonnal leáll, és ugrik, hogy végrehajtsa a kivétel blokkba írt kódot.

kivéve

Az kivéve kulcsszó azt a kódblokkot jelöli, amely akkor kerül végrehajtásra, ha a try blokk végrehajtása során kivétel keletkezik. Több kivételes blokkot is definiálhat a különböző típusú kivételekhez, amelyek felvehetők. Ezt később illusztráljuk.

végül

Az utolsó kulcsszó a Python Try Exceptben használt harmadik és utolsó kulcsszó. Megjelöl egy kódblokkot, amely a kivételtől függetlenül végrehajtásra kerül.

Egy példa

Íme egy példa arra, hogy a fenti kulcsszavak hogyan kezelhetnek egy kivételt. Az előző példát erre módosítjuk.

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")

Ha a fenti kódot 5-tel, érvényes bevitellel futtatja, a következőket kapja:

  Szinte minden buta készülék okossá tétele

És ha a „hello” bevitellel futtatja, a következőket kapja:

Tehát amikor a try blokk kódjának futtatása közben nem merült fel kivétel, a számítógép a végső blokkhoz lépett. Ha azonban a try blokkban a kód végrehajtása közben kivételt jeleztek, a számítógép átállt a kivétel blokkra, majd a végső blokkra.

Kivételeket is kezelhet bizonyos típusú hibák esetén. Ha például a ValueError és a KeyboardInterrupt kivételeket meghatározott módon szeretné kezelni, módosíthatja a fenti kódot a következőképpen:

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")

A fenti kódban a blokkok kivételével 3 van. Az első blokk kivételével csak a ValueError kivételeket, míg a második csak a KeyboardInterrupt kivételeket. Az utolsó kivétel blokk nem rendelkezik hozzárendelt kivételtípussal, amelyre figyelni kellene. Ennek eredményeként elkapja a fennmaradó kivételeket, amelyeket az első két blokk nem fogott meg.

A fenti kód futtatásával ehhez hasonló kimenetet kell kapnia:

Kivétel esetén a kivételobjektumban további információkat kaphat a kivételről. A kivételobjektumhoz való hozzáféréshez használja a as kulcsszót. A következőképpen használják:

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)

Hogyan emeljünk kivételeket

Eddig más funkciók által felvetett kivételekkel foglalkoztunk. Azonban az is lehetséges, hogy kivételeket emeljen ki a kódban. A kivétel felemeléséhez használjuk a raise kulcsszót. Megadunk egy osztályt is, amely bemutatja, hogy milyen típusú kivételt szeretnénk felhozni, és a kivételhez társított, ember által olvasható üzenetet.

A következő példában az Exception osztályt használjuk egy általános kivétel létrehozására. Ezután átadjuk az üzenetet az osztály konstruktorának.

raise Exception('Something went wrong')

Ha a fenti kódrészletet programként futtatja, a következőhöz hasonló kimenetet kap:

Különféle kivételeket is megadhat. Például felállíthat egy TypeError kivételt, ha egy értéknek rossz az adattípusa:

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

Vagy ha a megadott érték kívül esik az elfogadható határokon, akkor ValueError-t állíthat elő:

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

A kivételtípusokat a Kivétel osztály alosztályozásával is létrehozhatja. Íme egy példa:

class InvalidHTTPMethod(Exception):
    pass

A fenti példában létrehoztunk egy InvalidHTTPMethod osztályt, amely az Exception osztályból örökli. Ugyanúgy használhatjuk, mint korábban, hogy kivételeket emeljünk ki:

raise InvalidHTTPMethod('Must be GET or POST')

Általános felhasználási esetek kivételes kezeléshez

A kivételkezelést sok forgatókönyvben használják. Az előző példa bemutatta, hogyan tudja kezelni a felhasználói bevitel miatti kivételeket. Ez a rész további két olyan helyzettel foglalkozik, amelyekben a kivételkezelés hasznos. Ezek a sikertelen hálózati kérésekből adódó kivételek és a fájlok olvasása közbeni kivételek kezelése.

  A háttérkép és a téma módosítása a Google Chromebookon

Hálózati kérések készítése

Az alábbi példában kérést intézünk a Google-hoz. Figyelünk a kivételekre, hogy kezeljük őket. Ezeket a kivételeket a requests.exceptions objektum határozza meg.

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}")

Adatok olvasása fájlból

Ebben az utolsó példában a hello.txt fájlból olvasunk adatokat. Az esetlegesen felmerülő általános kivételeket is kezeljük, mint például a FileNotFound hiba és az 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}")

Következtetés

Ez a cikk azt vizsgálta, hogy mik voltak a kivételek, és miért merültek fel. Azt is megállapítottuk, hogy kezeljük őket a kód megbízhatóbbá tétele és az összeomlások megelőzése érdekében. Végül kitértünk a kivételek kezelésére, valamint néhány kivétel felemelésére.

Ezután tekintse meg a gyakori Python-hibatípusokat és azok megoldási módját.