Kivételkezelés

A programok futása közben előfordulhatnak olyan helyzetek, amikor valami nem a várt módon történik. Például:

Ezeket a rendellenes futási helyzeteket kivételeknek (exception) nevezzük.

A kivételkezelés célja, hogy a program ezeket a helyzeteket felismerje, megfelelően reagáljon rájuk, és lehetőség szerint ne álljon le ellenőrizetlenül.

Mi az a kivétel?

A kivétel egy olyan esemény a program futása során, amely megszakítja a normál végrehajtási folyamatot.

Például:

szam = int(input("Adj meg egy egész számot: ")) eredmeny = 10 / szam

Ha a felhasználó 0 értéket ad meg, akkor a program nem tudja végrehajtani a 10 / szam műveletet.

Ha pedig például az írja be hogy: "alma", akkor az int() sem tudja számmá alakítani az adatot.

Ilyenkor kivétel keletkezik.

Kivételkezelés szükségessége

Kivételkezelés nélkül egy nem várt hiba gyakran az egész program futását megszakítja.

Például:

szam = int(input("Szám: ")) print(100 / szam) print("A program vége.")

Ha a felhasználó 0-t ír be, akkor a program hibával leáll, és:

print("A program vége.")

már nem hajtódik végre.

Kivételkezeléssel viszont szabályozhatjuk, mi történjen hiba esetén:

try: szam = int(input("Szám: ")) print(100 / szam) except ZeroDivisionError: print("Nullával nem lehet osztani.")

Így a program felismeri a konkrét problémát, és érthető üzenetet tud adni.

A try–except szerkezet

A kivételkezelés egyik legfontosabb eszköze a try–except.

Általános formája python-ban:

try: # olyan utasítások, amelyek kivételt okozhatnak except: # mi történjen kivétel esetén

Például:

try: szam = int(input("Adj meg egy számot: ")) except: print("Nem megfelelő adatot adtál meg.")

A try blokkban található az a kódrészlet, amelynek végrehajtása közben kivétel történhet. Ha nem történik kivétel, az except blokk kimarad. Ha viszont kivétel történik, a program az except blokkban folytatja a végrehajtást.

Konkrét kivételtípusok

Érdemes nem általánosan minden kivételt elkapni, hanem megadni, hogy pontosan milyen kivételt kezelünk.

Például:

try: szam = int(input("Adj meg egy egész számot: ")) except ValueError: print("Ez nem egész szám.")

Itt a ValueError azt jelzi, hogy a kapott érték típusa ugyan megfelelő lehetne, de az érték nem használható az adott művelethez.

Gyakori kivételek

Pythonban számos beépített kivételtípus létezik.

Tipus Leírás
ValueError Az érték nem megfelelő.
TypeError Nem megfelelő típusú adatokkal próbálunk műveletet végezni.
ZeroDivisionError Nullával próbálunk osztani.
IndexError Egy lista vagy más szekvencia nem létező indexére hivatkozunk.
KeyError Egy szótárból olyan kulcsot próbálunk lekérdezni, amely nem létezik.
FileNotFoundError Olyan fájlt próbálunk megnyitni, amely nem található.

Több kivétel kezelése

Egy try blokkhoz több except ág is tartozhat.

try: szam = int(input("Szám: ")) eredmeny = 100 / szam except ValueError: print("Nem számot adtál meg.") except ZeroDivisionError: print("Nullával nem lehet osztani.")

A Python megvizsgálja, milyen típusú kivétel történt, és a hozzá tartozó except blokkot hajtja végre.

Az else ág

A try–except szerkezethez opcionálisan else is kapcsolható.

try: szam = int(input("Szám: ")) except ValueError: print("Hibás adat.") else: print("Sikeres átalakítás:", szam)

Az else blokk csak akkor hajtódik végre, ha a try blokkban nem történt kivétel.

A finally ág

A finally blokk olyan utasításokat tartalmaz, amelyeket a program a kivétel bekövetkezésétől függetlenül végrehajt.

try: fajl = open("adatok.txt") tartalom = fajl.read() except FileNotFoundError: print("A fájl nem található.") finally: print("A művelet befejeződött.")

A finally tehát akkor is lefut, ha hiba történt, és akkor is, ha nem.

Gyakran használjuk például erőforrások felszabadítására.

A teljes szerkezet

A try, except, else és finally együtt:

try: # megpróbálandó művelet except ValamilyenHiba: # hibakezelés else: # ha nem történt hiba finally: # minden esetben végrehajtódik

Nem szükséges mindegyik elemet használni.

A kivétel objektuma

Az except segítségével magát a kivételt is el tudjuk menteni.

try: szam = int("alma") except ValueError as hiba: print("Hiba történt:", hiba)

A hiba változó tartalmazza a kivétel objektumát.

Ez hasznos lehet hibakeresésnél, naplózásnál vagy részletesebb hibaüzenetek készítésénél.

Kivétel továbbítása raise segítségével

Nemcsak elkapni tudjuk a kivételeket, hanem saját kivételt is létrehozhatunk a raise utasítással.

kor = -5 if kor < 0: raise ValueError("A kor nem lehet negatív.")

A raise azt jelenti, hogy szándékosan kivételt váltunk ki.

Ez különösen hasznos az adatok ellenőrzésekor.

Például:

def osztas(a, b): if b == 0: raise ValueError("A nevező nem lehet nulla.") return a / b

A függvény így egyértelműen jelzi, ha érvénytelen paramétert kapott.

Saját kivételtípus létrehozása

Nagyobb programokban saját kivételtípusokat is létrehozhatunk.

class TulAlacsonyEgyenlegError(Exception): pass

Ezután:

egyenleg = 5000 osszeg = 8000 if osszeg > egyenleg: raise TulAlacsonyEgyenlegError( "Nincs elegendő pénz a tranzakcióhoz." )

A saját kivétel kezelhető:

try: if osszeg > egyenleg: raise TulAlacsonyEgyenlegError() except TulAlacsonyEgyenlegError: print("Nincs elegendő egyenleg.")

Saját kivételeket főként összetettebb alkalmazásokban érdemes használni, amikor a program saját hibakategóriáit szeretnénk világosan elkülöníteni.

A kivételkezelés legfontosabb szabályai

A jó kivételkezelés néhány egyszerű alapelvet követ.


A Python - C# - JavaScript nyelv összehasonlítása

Feladat Python C# JavaScript
Hibára figyelő blokk try try try
Kivétel kezelése except catch catch
Mindenképpen lefutó rész finally finally finally
Kivétel kiváltása raise throw throw
Kivétel típusa ValueError stb. FormatException stb. Error / saját Error
Kivétel változója except ... as e catch (... ex) catch (hiba)

A legfontosabb szerkezeti különbség:

Python:

try: ... except ValueError as e: ... finally: ...

C#:

try { ... } catch (FormatException ex) { ... } finally { ... }

JavaScript:

try { ... } catch (hiba) { ... } finally { ... }

Gyakorló feladatok

  1. Írj programot, amely két számot kér be, majd elosztja őket. Kezeld a nullával való osztást!
  2. Kérj be egy egész számot, és kezeld, ha a felhasználó szöveget ír be!
  3. Próbálj meg egy megadott fájlt megnyitni, és kezeld a FileNotFoundError kivételt!
  1. Kérj be egy számot! Ha a szám nem pozitív, válts ki hibát.
  2. Kérd be a felhasználó életkorát! Ha negatív számot ad meg, legyen hiba. Ha megfelelő számot ad meg, írd ki az életkorát.

További gyakorló feladatok

  1. Biztonságos osztó program

Készíts programot, amely két egész számot kér be a felhasználótól, majd elvégzi az osztást.

A program:

  1. Jegy bekérése

Kérj be egy dolgozatjegyet 1 és 5 között.

A program:

  1. Bevásárlás és egyenleg

Egy vásárlónak van egy meghatározott pénzösszege.

Kérd be:

Ha a termék ára nagyobb az egyenlegnél, válts ki kivételt.

Sikeres vásárlás esetén írd ki a megmaradt összeget.

  1. Lista keresése

Adott egy lista/tömb nevekkel: Anna, Béla, Csilla, Dávid

Kérj be egy sorszámot, és írd ki a hozzá tartozó nevet.

Ha a sorszám nem létezik, kezeljétek megfelelően a hibát.

  1. Jelszó ellenőrzése

Készíts programot, amely bekér egy jelszót.

A jelszó akkor megfelelő, ha:

Ha nem megfelelő, váltson ki kivételt.

  1. Egyszerű banki program

Egy bankszámlán 50 000 Ft található.

Kérd be a felhasználótól, hogy mennyi pénzt szeretne felvenni.

A program: