Pár poznámek o zpracování chyb u nativních PHP funkcí

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
David Grudl
Nette Core | 8227
+
0
-

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