4.10
Výjimky
Podobně jako je tomu i u jiných objektových jazyků, nabízí i PHP ošetření chyb s pomocí výjimek. Výjimky jsou objekty. Výjimka může být hozena (throw) a chycena (catch). Nezachycená výjimka je Fatal error: Uncaught exception. Výjimky „zkoušíme chytat“ v try bloku, který musí mít minimálně jeden catch blok. V PHP je pro tento účel připravena přednastavená třída Exception, která nabízí mimo jiné metody getMessage(), getCode(), getFile()getLine().
Základní příklad zachycení vyhozené výjimky:
try { printf('Toto se provede.<br>'); throw new Exception('Nastala chyba'); printf('Toto se neprovede.<br>'); } catch (Exception $e) { printf("Zachycení výjimky: %s.<br>", $e->getMessage()); }
Výstup:
Toto se provede. Zachycení výjimky: Nastala chyba.
Z výše uvedeného příkladu si ještě všimněte, že jakmile se v try bloku výjimka vyhodí, následné operace se již nevykonají a skočí se rovnou do catch bloků.
Nyní si ukážeme vyhazování výjimky ve funkci, vytvoření vlastní třídy pro výjimky a více catch bloků:
class DivisionException extends Exception {} function divide($a, $b) { if (!$b) { throw new DivisionException("Division by zero"); } $c = $a / $b; if ($c < 0.001) { throw new Exception("Result is too small"); } return $c; } try { printf("Výsledek dělení: %f <br>", divide(1, 2000000)); printf("Výsledek dělení: %f <br>", divide(1, 0)); } catch (DivisionException $e) { printf("Zachycení výjimky DivisionException: %s<br>", $e->getMessage()); } catch (Exception $e) { printf("Zachycení výjimky Exception: %s<br>", $e->getMessage()); }
Výstup:
Zachycení výjimky: Result is too small
Naše funkce divide() umí vyhazovat dva typy výjimek. Při dělení nulou vyhazuje naší vlastní DivisionException, která z Exception dědí a když je číslo malé, tak vyhazuje standardní Exception. Tato výjimka je tu nyní v této funkci jen pro demonstraci. V následném try bloku funkci pro dělení voláme s různými parametry a v případě vyhození výjimky ji patřičný catch blok ošetří.
Zkuste si zadávat různé hodnoty do parametrů funkce divide()try bloku. Zkuste si catch bloky prohodit. Zkuste jeden, druhý, nebo oba catch bloky zrušit.
Poznámka
Nezapomeňme, že standardní knihovní vestavěné neobjektové funkce výjimky nevyhazují. Jednak nemá logiku, aby se toto dělo v neobjektovém kódu, a také by to zbouralo všechny již postavené webové aplikace.