A szokásos "napi" php.net böngészgetésem során bukkantam rá a lentebb olvasható kódrészletre (bár nem egy bonyolult dolog, de mégsem jutott volna magamtól eszembe), amit szerintem kötelezővé kellene tenni minden egyes PHP alapú alkalmazás fejlesztési időszaka alatt. A kód nem csinál mást, mint hogy minden hibát kivétellé alakít át, így ha nincsenek elkapva, akkor egy egyszerű E_NOTICE-tól is lehal az oldal fatal error-ral, az error_reporting beállítástól függetlenül. :)
function error_handler($errno, $errstr, $errfile, $errline)
{
throw new ErrorException(
$errstr, 0, $errno,
$errfile, $errline
);
}
set_error_handler('error_handler');
Egyéni ízlés kérdése, de én még az alábbi kóddal kiegészíteném, hogy fatal error-ok helyett inkább valami olvasható dolgot kapjak:
function exception_handler($ex)
{
print('<pre>'.$ex.'</pre>');
}
set_exception_handler('exception_handler');
És hogy miért is lenne hasznos? Elég sokan kikapcsolják az E_NOTICE-ok jelzését még fejlesztés alatt is, mondván hogy az nem számít. Pedig elég sok kisebb hibára (pl. változó név vagy tömb kulcs elgépelésekre) hívhatná fel a figyelmet, amik így csak a tesztelési időszakban derülnek ki (ha kiderülnek). Emellett biztonsági haszna is van, mint az a php.net-en is olvasható.
Ezt az írást követte el 21:15-kor. Kommentelj! 

Gondolod, ha valaki annyira töketlen, hogy fejlesztés alatt az E_NOTICE-nál magasabb hibaszintet használ, pont egy ilyen megoldással fog „vacakolni”? Egyébiránt nem látom, hogy milyen pluszt nyújt a helyes módszertan elsajátításával szemben?
Nem sok esélyét látom annak, hogy most ezzel sikerülni fog megváltani a világot, de hátha... :-)
A plusz, amit nyújt az az, hogy ha a második kódrészletet elhagyjuk, akkor egy sima E_NOTICE esetén is lehal a script, ami azért zavaróbb/feltűnőbb, mintha csak kiírna (vagy nem írna ki) valamit. De biztos van egyéb haszna is annak, ha kivétel jön az alapértelmezett hibaszövegek helyett.
Egyik projektnél pont most írtam debuggert, és a keretrendszerbe beleépítettem egy hasonlót, bár annak kicsit más a működése; egyrészt ha a debugger aktív, akkor minden hibát elkap és kiír, ha a debugger nem aktív, akkor pedig a hiba súlyosságától függően vagy leállítja az egész oldalt és átnavigál egy statikus "o-ó, valami nem oké" oldalra, miközben küldi a logot mélben, vagy csak küldi a logot mélben. :)