Kihagyás

Kivételkezelés

  • Elkapás
  • Dobás

Bevezetés

  • A kivételek lehetőséget biztosítanak, hogy a programhiba eseteén ne álljon le a kód működése.
  • Különböző hibatípusokat "elkapunk" és ezekre reagálunk.
  • Szükség esetén saját hibát "dobunk" a felhasználó részére.

Elkapás

Próbáljuk ki az alábbi kódot és nézzük meg, hogy mi történik!

print(x)

Futtatás után az alábbi hibaüzenetet kapjuk

Traceback (most recent call last):  
File "file.py", line 1, in < module >  
    print(x) 
NameError: name 'x' is not defined

Próbáljuk ki az alábbi kódot és nézzük meg, hogy mi történik!

print(16/0)

Futtatás után az alábbi hibaüzenetet kapjuk

Traceback (most recent call last):  
File "file.py", line 1, in < module >  
    print(16/0)  
ZeroDivisionError: division by zero

Szerkezeti felépítés

  1. A try blokk lehetővi teszi, hogy teszteljük a kódblokk hibákat keresve.
  2. Az except blokk lehetővé teszi a hiba kezelését (elkapását).
  3. Az else blokk lehetővé teszi a kód futtatását, ha nincs hiba.
  4. A finally blokk lehetővé teszi a kód végrehajtását, függetlenül a try és except blokkok eredményétől.

try-except

1
2
3
4
try: # kódblokk amiben hiba lehet
    print(x)
except: # minden hiba elkapása
    print("Hiba történt!")

try-except-else

Az else blokk lehetővé teszi a kód futtatását, ha nincs hiba.

1
2
3
4
5
6
try: # kódblokk amiben hiba lehet
    print(x)
except: # minden hiba elkapása
    print("Hiba történt!")
else:
    print("Nincs hiba!")

try-except-else-finally

A finally blokk lehetővé teszi a kód végrehajtását, függetlenül a try és except blokkok eredményétől.

1
2
3
4
5
6
7
8
try: # kódblokk amiben hiba lehet
    print(x)
except: # minden hiba elkapása
    print("Hiba történt!")
else:
    print("Nincs hiba!")
finally:
    print("Mindig lefut, akár van hiba, akár nincs!")

Adott hiba elkapása

Lehetőségünk van csak egy adott hibát elkapni, amelyeknek különböző fajtái vannak. Pár példa:

  • NameError: hibás/nem létező változónév
  • ZeroDivisionError: nullával való osztás hiba
  • SyntaxError: szintaxis hiba
  • TypeError: típus hiba
  • ValueError: érték hiba
  • FileNotFoundError: nem létező fájl

Megadott hiba elkapása példa

1
2
3
4
5
6
7
8
try:
    print(16/0)
except ZeroDivisionError:
    print("Nullával nem tudunk osztani!")
else:
    print("Nem volt hiba!")
finally:
    print("Vége a próbának")

Több megadott hiba elkapása példa

Amennyiben egymás alá több exceptet adunk meg, úgy lehetőségünk van minden egyes hibát másképp kezelni.

try:
    print(16/2 # direkt
except SyntaxError:
    print("Szintaxis hiba történt!")
except ZeroDivisionError:
    print("Nullával nem tudunk osztani!")
else:
    print("Nem volt hiba!")
finally:
    print("Vége a próbának")

Valós példa fájl megnyitása esetén

1
2
3
4
5
6
7
8
9
try:
    f = open("demofile.txt")
except FileNotFoundError:
    f = open("demofile.txt", "w")
    f.write("Fájl letrehozása")
else:
    print(f.read())
finally:
    f.close()

Dobás

Általános kivétel dobás

Python fejlesztőként dönthetünk úgy, hogy kivételt dobunk, ha egy feltétel előfordul.
Kivétel dobáshoz (vagy emeléséhez) a raise kulcsszót használjuk.

1
2
3
4
x = -1

if x < 0:
    raise ValueError("Az x nem lehet kisebb mint 0!")