A Python programozási nyelv

Kivételkezelés

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!

Szintaxis

Kivétel lekezelésére kétféle szerkezet használható, a

try ... except

vagy

try ... finally.

Kivételek definiálása

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.

>>> class MyError(Exception): ... def __init__(self, value): ... self.value = value ... def __str__(self): ... return repr(self.value)

Kivételek kiváltása

Kivételt kiváltani a raise utasítással tudunk.

raise NameError,'Hello'

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:

try:
    ...
except ValueError:
    print 'ValueError volt itt, valaki csak lekezeli'
    raise

 Létrehozhatunk kivételosztályokat is a beépített standard kivétel osztályainak leszármaztatásával.

Kivételek kezelése

try ... except

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:

try:     ... except (NameError,TypeError):     ... except:     print 'Nem várt kivétel lépett fel' else     print 'semmilyen kivétel nem lépett fel'

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.

try ... finally

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 kivételek terjedése

A try blokk a blokkban hívott függvények által kiváltott kivételt is lekezeli! például:

def this_fails():     x=1/0 try:     this_fails() except ZeroDivisionError, detail:     print 'Handling run-time error:',detail output: Handling run-time error: intgeger division or modulo

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 argumentuma

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:

try:     spam() except NameError,x:     print 'name',x,'undefined'

A standard kivételek hierarchiája

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

Beépített hibajelzések

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.