Jet\Debug_ErrorHandler

Základní třída pro handlery - moduly pro správu chyb. Její hlavní smysl je držet seznam registrovaných handlerů, zachytávat PHP chyby a zachytávat nezachycené výjimky (a další věci - vize seznam metod). Jedná se o středobod subsystému ErrorHandler.

Metoda Význam
static registerHandler(
Debug_ErrorHandler_Handler $handler
): void
Zaregistruje handler (instanci třídy, která dědí od abstraktní třídy Jet\Debug_ErrorHandler_Handler)

POZOR! Tato metoda se v praxi při inicializaci nepoužívá. Hadler má statickou metodu register(), která se postará o registraci handleru.
static unRegisterHandler(
string $name
): void
Odregistruje daný error handler.
static getHandler(
string $name
): Debug_ErrorHandler_Handler|null
Vrátí instanci handleru podle jeho názvu - pokud je registrován. Pokud není, pak vrátí null.
static getRegisteredHandlers(): Debug_ErrorHandler_Handler[] Vrátí seznam všech registrovaných handlerů.
initialize(): void Inicializace subsystému.
static handleError(
int $code,
string $message,
string $file = '',
int $line = 0
): void
Stará se o zachycení PHP chyb.
static handleException(
Throwable $exception
): void
Metoda se stará o zachycení nezachycených výjimek.
static getLastError(): Debug_ErrorHandler_Error|null Vrátí instanci poslední zaznamenané chyby.
static addIgnoreNonFatalErrorsPath(
string $path
): void
Občas je nutné potlačit nezávažná chybová hlášení typu notice, warning a podobně. Tedy obecně to dobrý nápad není, každému problému by měla být věnována patřičná péče. Proto má také Jet ve výchozím stavu plně zapnutý error reporting.
Ale svět není dokonalé místo :-) Občas jinou možnost nemáte (např. při integraci knihovny / komponenty třetí strany). Pak je tu ještě ten fakt, že silence operátor (@) není možné v PHP8 spolehlivě a vždy správně detekovat.
Z toho důvodu existuje možnost nastavit ErrorHandler tak že má nezávažné chyby (warning, notice) v určitých adresářích ignorovat. 

K čemu je to dobré?

Dvě situace:
  • Jet má systém I/O, kde klasické operace se soubory a adresáři zapouzdřené tak, aby místo různých warningů bylo použito vyjímek. Je ale nutné nějak potlačit spracování běžných chyb v rámci této části Jet.
  • Druhá možnost je ze života. Už se mi několikrát stalo, že jsem musel do systému zakomponovat knihovnu třetí strany. Např. různé klienty pro služby třetích stran, týká se to hlavně e-shopů. A taková knihovna může být různých warning a notice plná. 
    Klient (zákazník, který naše služby platí) nemá důvod platit vývoj vlastní knihovny a za vás hypotéku také nikdo nezaplatí (tedy zdarma pracovat nemůžeme). Pochopitelně našeho zákazníka / klienta zajímá aby to fungovalo a aby to co nejdříve plnilo svůj účel. A pokud je jediný problém knihovny ten, že sem tam vyhodí notice, tak je nejlepší řešení toto prostě potlačit, ale pro svou aplikaci si nechat plný error reporting. (Pochopitelně nebudu do aplikace integrovat něco, co je děravé jak staré necky - k ničemu takovému vás nenabádám.)
  • ... a asi vás napadne něco dalšího ... 
V takový situaci je možné ErrorHandleru říct, že tam a tam je něco potenciálně lehce problematického a nemá si toho všímat.

K tomu slouží tato statická metoda a vy si můžete zaregistrovat adresáře dle libosti a potřeb. Jen by asi nebylo dobré zaregistorvat například celý adresář application :-)
static getIgnoreNonFatalErrorsPaths(
) : array
Viz addIgnoreNonFatalErrorsPath.

Vrátí seznam registrovaných adresářů.
static doItSilent (
callable $operation
) : array
Opět problematika potlačení chybového hlášení. Může se stát, že několik faktorů bude působit proti sobě. Jet aplikace má být nastavena tak, že zobrazuje / loguje každou chybu - i pouhé varování. Na druhou stranu některé funkce PHP mohou stále varování generovat. Ovšem potřebujeme je použít i v situaci, kdy varování generují, ale rozhodně nechceme tato očekávaná varování zaznamenávat do logu a už vůbec ne zobrazovat.

Bohužel silent operátor (@) se v PHP8 nedá detekovat jak tomu bylo možné dříve. Tedy není možné jej efektivně použít i když by se to opravdu hodilo.

Řešení je udělat to například takto: $cached_data Debug_ErrorHandler::doItSilent(function() use ($cached_data) {
    return 
unserialize$cached_data );
});
Předchozí kapitola
Jet\Debug
Další kapitola
Jet\Debug_ErrorHandler_Error