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.
Tartalomjegyzék
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.
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:
É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.
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.