ErrorHandler
Primární funkcí Jet ErrorHandleru je:
- Zachycení a zpracování standardních chybových hlášení.
- Zachycení a zpracování nezachycených výjimek.
- Předání obsluhy zachycených problémů vlastním handlerům, které si vývojář může doplňovat, upravovat a jakkoliv měnit dle svých potřeb. Handler je vlastně modul, který provede s chybou to co potřebujete. To znamená že napŕíklad zobrazení chyb řeší konkrétní handler, zaznamenání do logu zase jiný handler. Součástí ukázkové aplikace jsou handlery pro zobrazení chyby, logování a zobrazení chybové stránky "500" v případě fatální chyby na produkčním prostředí.
- Dále má ErrorHandler podpůrné funkce využívané platformou Jet a aplikacemi na ní postavených. Například náhrada silence operátorů ve volitelných adresářích, informace o poslední chybě a podobně.
Pro poznání celého systému je dobré prostudovat tyto třídy:
Třída | Její význam a určení |
---|---|
Jet\Debug | Zcela základní třída, kterou používá i profiler. Jejím hlavním účelem je informovat ladící subsystém o druhu požadavku, který se momentálně zpracovává. Přesněji řečeno o druhu výstupu, který je očekáván (HTML, JSON a podobně). |
Jet\Debug_ErrorHandler | Základní třída pro správu chyb. Její hlavní smysl je držet seznam registrovaných handlerů, zachytávat chyby od PHP a zachytávat nezachycené výjimky (a další věci - vize podrobnosti o dané třídě). Tedy je to třída, která je středobodem subsystému ErrorHandler. |
Jet\Debug_ErrorHandler_Error | Jak chyby, tak nezachycené vyjímky ErrorHandler vždy transformuje do instance této třídy. Ta tedy představuje zachycený problém, který je předán jednotlivým handlerům. |
Jet\Debug_ErrorHandler_Handler | Abstraktní třída od které dětí jednotlivé samotné handlery. |
Handlery a ukázkové handlery (součást ukázkové aplikace)
Jak bylo uvedeno výše, tak handlery jsou moduly, které provádí se zachyceným problémem to co potřebujete. To znamená, že podobu zobrazeného chybového hlášení neřeší Jet, ale jeden z handlerů, stejně formu logování a tak dále.
Handlery jsou součástí aplikačního prostoru, najdete je v adresáři ~/application/ErrorHandlers/
Neváhejte do adresáře nahlédnout a pokud chcete, tak si upravte vše jak potřebujete. Stejně tak si můžete doplnit vlastní handler. Prostě ať vám to slouží tak jak vy chcete :-)
Zde je seznam výchozích handlerů v rámci ukázkové aplikace
Handler | Stručný popis |
---|---|
JetApplication\ErrorHandler_HTTPHeader | Pokud se jedná o fatální chybu, pak se postará o odeslání HTTP návratového kódu 500. |
JetApplication\ErrorHandler_Display | Zabezpečí zobrazení chybového hlášení. Podle druhu očekávaného výstupu (viz třída Jet\Debug ) naformátuje buď textový, nebo HTML výstup a ten zobrazí. POZOR! Na produkčním prostředí nesmí být tento handler aktivní. Jde o bezpečnost. Ovšem můžete si inicializaci (viz dále) naskriptovat tak, aby se aktivoval např. pouze pro vaší IP (nebo pomocí jiného "kouzla"), když urgentně řešíte nějaký náhlý problém. Ale vždy je nutné dbát na to, aby chyby neviděl nikdo krom vás. |
JetApplication\ErrorHandler_Log | Sestaví záznam pro log a ten uloží (do adresáře, který je definován pomocí Jet\SysConf_Path::getLogs() ) |
JetApplication\ErrorHandler_ErrorPage | Tak jako má být ErrorHandler_Display na produkčním prostředí deaktivovaný, tak tento handler by měl být naopak aktivní. Jeho smyslem je pokud možno zobrazit koncovému uživateli něco alespoň trochu smysluplného, když už online aplikace přestala fungovat díky vážné chybě (prostě když to "spadlo"). |
Inicializace handlerů
Inicializace a nastavení se provádí ve skriptu ~/application/Init/ErrorHandler.php .
Ve výchozím stavu má inicializace tuto podobu:
use Jet\Debug_ErrorHandler;
use Jet\SysConf_Path;
use Jet\SysConf_Jet_Debug;
require SysConf_Path::getLibrary() . 'Jet/Debug.php';
require SysConf_Path::getLibrary() . 'Jet/Debug/ErrorHandler.php';
require SysConf_Path::getApplication() . 'ErrorHandlers/Log.php';
require SysConf_Path::getApplication() . 'ErrorHandlers/Display.php';
require SysConf_Path::getApplication() . 'ErrorHandlers/ErrorPage.php';
ErrorHandler_Log::register();
if( SysConf_Jet_Debug::getDevelMode() ) {
ErrorHandler_Display::register();
} else {
ErrorHandler_ErrorPage::register();
}
Debug_ErrorHandler::initialize();
Povšimněte si prosím několika důležitých věcí:
- Není použit Autoloader, ale klasické require. Je to z toho důvodů, že Autoloader se inicializuje až po ErrorHandleru. Není tedy možné (a ani vhodné) jej použít.
- Podle toho zda je / není aktivní vývojářský režim (viz zde) se aktivuje právě to co je pro dané prostředí potřebné.