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.
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 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.
try–except szerkezetA 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.
É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.
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ó. |
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.
else ágA 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.
finally ágA 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 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.
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.
raise segítségévelNemcsak 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.
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 jó kivételkezelés néhány egyszerű alapelvet követ.
except blokkot.| 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 {
...
}
FileNotFoundError kivételt!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:
A művelet befejeződött.Kérj be egy dolgozatjegyet 1 és 5 között.
A program:
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.
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.
Készíts programot, amely bekér egy jelszót.
A jelszó akkor megfelelő, ha:
Ha nem megfelelő, váltson ki kivételt.
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: