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é.
Inicializaci si samozřejmě můžete upravit dle vašich potřeb.
Předchozí kapitola
Debugging aneb ladění a potřebné nástroje
Další kapitola
Jet\Debug