A Pyton 1.5 előtti verzióiban az összes kivételt karakterlánc objektumokként definiálták. A 1.5 és a későbbi verziókban a kivételek többsége azonban már osztályobjektum. A kivételeket az exceptions modul definiálja. Ezt a modult nem kell explicit módon importálni, mert alapértelmezés szerint az összes standard kivétel be van építve a névtérbe.
FIGYELEM: A Python 2.5-ös verziójától kezdve a string kivételek elavultnak számítanak, és várhatóan el fognak tűnni a nyelvből egy későbbi verzióban, így az osztály típusú kivételeket illik használni!
Kivétel lekezelésére kétféle szerkezet használható, a
vagy
A Pythonban a kivételek az Exception (BaseException) osztály leszármazottai. Az exceptions modul több előre kivétel osztályt definiál különféle futásidejű hibákhoz (pl. nullával osztás, típus egyezés), a programozó saját kivételeket is definiálhat, melyek egyszerűen az Exception-ból származó osztályok.
Kivételt kiváltani a raise utasítással tudunk.
A második argumentum a kivételkezelő paramétere lesz.
Az elkapott kivétel újradobható a raise utasítás egyszerűsített formájával:
Létrehozhatunk kivételosztályokat is a beépített standard kivétel osztályainak leszármaztatásával.
A parancsértelmező a program végrehajtása során kísértletet tesz a try blokkban lévő összes utasítás végrehajtására. Ha ennek során nem kell kivételt dobnia, a program a try...except blokk utáni utasítások végrehajtásával folytatódik. Ha a try blokkban fellép egy kivétel, amit egy except ágban specifikáltunk, akkor a vezérlés annak az ágnak adódik. Lefutása után a try blokk után folytatódik a futás (nincs lehetőség folytatni a hibánál). Ha nincs ebben a try blokkban lekezelve a fellépett kivétel vagy az except ágban is kiváltódik egy, akkor ha van, továbbadódik a külső try blokknak.
Egyetlen try blokkban több except utasítást is megadhatunk, illetve ugyanabban az except utasításban több kivételt is elkaphatunk. Ekkor azonban a kivételeket egy tuple adatszerkezetben kell megadni.
Egyszerre csak egy except ág fut le, és ha utolsónak írunk egy szimpla except ágat, akkor az elfogja az összes kivételt! például:
Van lehetőség else ágat írni egy try blokknak, erre akkor kerül a vezérlés, ha nem lép fel semmilyen kivétel a try blokkban.
A try...finally blokk finally része mindenképpen lefut, egyfajta rendberakási lehetőségként. Ha kivétel lép fel, akkor a finally rész lefutása után a kivétel újra kiváltódik. Ha break vagy return utasítással hagyjuk el a try blokkot, a finally rész akkor is lefut. Egy try blokknak vagy except ágai vannak, vagy finally ága, de mindkettő nem lehet egyszerre. A try blokkokat viszont egymásba ágyazhatjuk, így lehetőség van arra, hogy egy try...finally blokkot egy try...except-be ágyazzunk, és így lekezeljük a finally után újra kiváltódott kivételt.
A try blokk a blokkban hívott függvények által kiváltott kivételt is lekezeli! például:
Lekezeletlen kivétel esetén kiíródik a kiváltó programsor, a verem felderítésének (stack backtrace) módszerével.
A kivételek paraméterezhetőek, típusuktól függően más és más paraméterük lehet (több paramétert listában kell átvenni).
például:
Kivétel neve: |
Szülő |
Leírás |
Exception |
|
Az összes kivétel bázisosztálya |
StopIteration |
Exception |
Az váltja ki, ha egy iterátor next() metódusa semmilyen objektumra sem mutat |
SystemExit |
Exception |
A sys.exit() függvény válja ki |
StandardError |
Exception |
A StopIteration és a SystemExit kivételével az összes beépített kivétel bázisosztálya |
ArithmeticError |
StandardError |
Az összes olyan hiba bázisosztálya, amely numerikus számításoknál léphet fel. |
OverflowError |
ArithmeticError |
Az váltja ki, ha egy számítás eredménye meghaladja a numerikus típusra megengedett felső határértéket. |
FloatingPointError |
ArithmeticError |
Az válja ki, ha sikertelen egy lebegőpontos számítás |
ZeroDevisionError |
ArithmeticError |
Az osztás nullával vagy a modulo nullával művelet váltja ki az összes numerikus típusnál |
AssertionError |
StandardError |
Az assert utasítás sikertelensége váltja ki |
AttributeError |
StandardError |
Attribútumra való hivatkozás vagy hozzárendelés sikertelensége válja ki |
EOError |
StandardError |
Az váltja ki, ha sem a raw_input(), sem az input() függvényből nincs bevitel, és elértük a fájl végét |
ImportError |
StandardError |
Az import utasítás sikertelensége váltja ki |
KeybvoardInterrupt |
StandardError |
Az váltja ki, ha a felhasználó megszakítja a program végrehajtását |
LookupError |
StandardError |
Az összes keresési hiba bázisosztálya |
IndexError |
LookupError |
Az váltja ki, ha nem található egy index a sorozatban |
KeyError |
LookupError |
Az váltja ki, ha a megadott kulcs nem található a szótárban |
NameError |
StandardError |
Az váltja ki, ha egy azonosító nem található a lokális vagy a globális névtérben |
UnboundLocalError |
NameError |
Az váltja ki, ha egy függvényben vagy metódusban megpróbálunk hozzáférni egy lokális változóhoz, de nincs érték rendelve a változóhoz |
EnvironmentError |
StandardError |
Minden olyan kivétel bázisosztálya, amely a Python környezetén kívül fordul elő |
IOError |
EnvironmentError |
Egy I/O művelet sikertelensége váltja ki |
OSError |
EnvironmentError |
Az operációs rendszerrel kapcsolatos hibák váltják ki |
SyntaxError |
StandardError |
Szintaktikai hiba váltja ki |
IndentationError |
SyntaxError |
Helytelenül használt behúzás váltja ki |
SystemError |
StandardError |
Az váltja ki, ha a parancsértelmező valamilyen belső hibát észlel, de a hiba nem vezet leálláshoz |
SystemExit |
StandardError |
Az váltja ki, ha a Python parancsértelmezője a sys.exit() függvény meghívásával áll le. Ha nem kezeljük, akkor kilép a parancsértelmező |
TypeError |
StandardError |
Az váltja ki, ha olyan műveletet vagy függvényt próbálunk végrehajtani, amely az adott adattípusra nem érvényes |
ValueError |
StandardError |
Az váltja ki, ha egy adattípus beépített függvényének érvényesek ugyan az argumetumtípusai, de argumentumokként érvénytelen adatokat adtunk meg |
RutinTimeError |
StandardError |
Az váltja ki, ha a generált hiba egyik kategóriába sem tartozik |
NotImplementedError |
RutinTimeError |
Az váltja ki, ha egy örökölt osztályban kötelezően megvalósítandó absztrakt metódus nem valósult meg |
AssertionError
az assert utasítás sikertelen
AttributeError
Helytelen attribútumra való hivatkozás vagy értékadás.
EOFError
Közvetlen fájlvége, melyet input() vagy raw_input() generál.
FloatingPointError
sikertelen lebegőpontos számítás
IOError
I/O-kapcsolatos I/O mûveletek hiba.
ImportError
´import'-álási hiba, nem találja a modult vagy a nevet
IndexError
Szekvencia indexelése nem az értéktartományon kívül esik.
KeyError
Nem létezõ táblaváltozó (dictionary típusú változó) kulcsra hivatkozunk.
KeyboardInterrupt
Felhasználó a megszakítás billentyû esetében (gyakran ´Control-C')
MemoryError
Kimerült visszaállíthatatlan memória.
NameError
Nem meghatározott lokális vagy globális név keresésekor.
NotImplementedError
az örökölt osztályban a megvalósítandó absztrakt metódus nem
valósult meg
OsError
az operáció rendszerrel kapcsolatos
hiba
OverflowError
Nagyon nagy aritmetikai mûvelet esetében.
RuntimeError
Elavult mindenre használható módszer; helyette definiáljunk egy alkalmas
hibaüzenetet.
StopIteration
Egy iterator next() metódusa sehova sem mutat
SyntaxError
Az elemzõ szintaktikai hibát talált.
SystemError
Nem végzetes interpreterhiba, ún. "bug", kérjük jelentse.
SystemExit
´sys.exit()' meghívásakor
TypeError
Beépített operátornak vagy függvénynek helytelen típust adunk át.
UnboundLocalError
a függvény vagy metódus megpróbál hozzáférni egy lokális
változóhoz, de annak nincs értéke
ValueError
Argumentum hiba esetén, melyet a TypeError nem tartalmaz vagy annál pontosabban
meghatározott.
ZeroDivisionError
Osztásnál vagy moduló mûveletnél 0 második argumentum esetében.