Pár poznámek o zpracování chyb u nativních PHP funkcí
- David Grudl
- Nette Core | 8227
Ve vlastním kódu můžeme chybové stavy signalizovat následovně:
- vyhozením výjimky (asi nejobvyklejší případ v Nette Framework)
- návratovou hodnotou (vhodné tehdy, pokud by vyhození výjimky představovalo zbytečnou režii nebo by činilo použití funkce nepraktickým)
- pouhou notifikací (pokud funkce pracuje plnohodnotně, jen chce programátora na něco upozornit; např. deprecated metody)
- testováním pomocí jiné metody objektu (vhodné tehdy, je-li to skutečně praktické)
Framework vždy usiluje o to, aby chybová zpráva byla maximálně srozumitelná, návodná a k věci.
Při používání PHP funkcí se chybové stavy signalizují poměrně odlišně:
- návratovou hodnotou (nejobvyklejší případ)
- notifikací (chyby úrovně E_NOTICE, E_WARNING, …); speciální případ je fatální chyba
- testováním přes globální funkci
K ověření úspěchu PHP funkce lze obvykle použít test návratové hodnoty. Problém nastává ve chvíli, kdy návratová hodnota neodráží skutečný výsledek (např. start_session, preg fce) nebo nenese dostatečnou informaci o vzniklé chybě.
V takovém případě lze získat notifikační chybovou zprávu (přes error_get_last) nebo zavolat odpovídající globální funkci (např. preg_last_error, json_last_error). U obou případů je však komplikované ověřit, že chybovou zprávu skutečně vygenerovala námi volaná funkce a ne nějaká dřívější, protože neexistuje způsob, jak testovací funkce předem vyresetovat.
I kdybychom testovací funkce vyresetovali, stále je tu problém s PHP funkcemi, kterým se předává parametr callback – bude pak komplikované ověřit, že chybovou zprávu skutečně vygenerovala námi volaná funkce a ne (jiná) funkce uvnitř callbacku.
Notifikační chybové zprávy navíc nemají granularitu, představují jen textovou informaci bez možnosti nějakého dalšího rozlišení (čistým způsobem).
U některých PHP funkcí je signalizace chybových stavů ovlivněna zcela nepředvídatelným způsobem (json_decode, htmlspecialchars, mysqli_query), s čímž je také potřeba počítat. Pokud bychom chtěli vytvořit univerzální mechanismus, který zjistí, zda PHP funkce skončila úspěchem nebo chybou, neobešli bychom se bez studia zdrojového kódu PHP, a je možné, že v některých případech bychom řešení vůbec nenašli.
to be continued