A PHP 4-ben már bevezetésre került ugyan a kivételkezelés, azonban PHP 5 előtt inkább jellemzően csak kezdetleges hibakezeléssel kellett beérni a programozóknak. Ha egy alprogramban hiba lépett fel, akkor a programozó választhatott, hogy die() segítségével befejezi a programot, vagy a függvénye -1 vagy valamilyen hamis eredménnyel térjen vissza. A die([ string $status ] ) függvény meghívásával teljesen leáll az értelmezés, így ha az adott programszakasznak az volt a célja hogy valamilyen weboldalt állítson elő, akkor szinte biztosak lehetünk, hogy a végeredményként kapott HTML kimenet invalid.
Példa a die() függvény használatára:A die() függvényt gyakran használják az or operátor segítségével, annak lusta módon történő kiértékelése végett.
A PHP 5 kényelmes módot tesz lehetővé a kivételkezelés használatára. A kivételkezelés modellje hasonló más programozási nyelvekéhez. Ez a megvalósítás lehetővé teszi, hogy a tagfüggvények áthárítsák a hibakezelés terhét az ügyfélkódra, amikor valamilyen hiba lép fel.
A kivétel egy olyan objektum amelyet a kiváltáskor automatikusan feltölt a hibára jellemző értékekkel, beleértve a hiba helyét is. Minden kivétel – hasonlóan a többi kivételkezelő nyelvhez – egy közös ősosztályból, az Exception osztályból származik. Az Exception példányokat a programozónak kell létrehozni a hiba kiváltásakor a new kulcsszóval. Ezután a throw utasítással vissza tudjuk dobni az ügyfélkódnak. Ilyenkor a tagfüggvény végrehajtása teljesen befejeződik.
Az Exception osztály konstruktorának adhatunk a hibaüzenetre vonatkozó szöveges üzenetet, vagy tetszőleges hibakódot is.
Ha a tagfüggvény dobhat kivételt, akkor biztosítanunk kell, hogy hívóoldalon azt a kivételt el is fogjuk. Ehhez szükség van a try és a catch utasításpárokra. A try utasítás segítségével megpróbálhatunk végrehajtani egy adott blokkot, amiben ha kivétel váltódik ki, akkor azt a catch blokkban lehetőségünk van lekezelni.
Lehetőség van további catch ágak megadására, mint ahogy a fenti példa mutatja. Ilyenkor ne felejtsük el hogy az általánosabb kivételeket mindig érdemes hátrébb elhelyezni, mert különben a speciálisabb kivételeket esélye sem lesz a PHP-nek lekezelni, mert egyszerűen soha nem kerülhetnek sorra.
Ha kivételt keletkezik, a blokkban a következő kód már nem fut le, és a PHP megkeresi az első catch blokkot, amire illeszkedik a kivétel. Ha a kivételt nem sikerült elkapni, a PHP fatális hibát (Fatal Error) ad ki "Uncaught Exception ..." szöveggel, hacsak nem rendelkeztünk máshogy a set_exception_handler() beállításával.
A beépített Exception osztályt lehetőségünk tovább fejleszteni, ha elkészítjük egy alosztályát és kibővítjük saját funkcionalitással.
A beépített Exception osztály szerkezete nagyjából a következő:
Látható hogy csak a konstruktor illetve a __toString() mágikus metódus felüldefiniálható. Amennyiben felüldefiniálnánk a konstruktort, ajánlott a biztonság kedvéért meghívni a szülő osztály konstruktorát is.
Amikor lekezelünk egy kivételt, dönthetünk úgy, hogy továbbadjuk a kivétel lekezelésének felelősségét és kiváltunk egy újabb kivételt. Ilyenkor a kiváltott kivételben lehetőségünk van eltárolni az előző kivételt. Ily módon az egyes kivételeket láncszerűen egymás után tudjuk fűzni. Amikor a legkülső helyen be szeretnénk járni ezt a létrehozott láncot, akkor például a következő módon járhatunk el:
Saját kivétel definiálása:
Majd ennek a kivételnek a kiváltása:
A kivétel lekezelése:
A futás eredménye: