Closed ondrej-tuhacek closed 10 years ago
Error handler je nastaven kvůli tomu, aby i když nastane chyba v php / nette / zend / whatever, server vždy vracel validní json-formatted error. Ze stejného důvodu se vždy vypíná laděnka v render metodě, kde dochází k samotné server execution. Koukám do kódu a nemám debugger v example vypnutý - doplním.
Napadá mě dodělat přepínač, který nebude hlídat zda nastala chyba v rámci user-defined kódu. Ze zkušenosti ale nemůžu doporučit tohle vypnout, protože pokud tam pak bude nějaký skutečný error, aplikace se o tom nedozví - protože dostane php bordel, který jsonem nenaparsuje.
Dle RFC serverová část musí vždy vrátit validní json-error object, pokud došlo k jakékoliv chybě.
Imho to zavináčema nebude, proto v php jsou -- otestuju.
Tak ty chyby, které jsou úmyslně v Nette potlačené zavináčem lze i ve vlastním handleru obejít, Stačí do vlastního error handleru přidat toto:
// if error has been supressed with an @
if (error_reporting() == 0) { return; }
Tím se zeptáme, zda byla chyba potlačena a pokud ano, tak nic neděláme. Je to popsané v dokumentaci zde: http://cz2.php.net/manual/en/language.operators.errorcontrol.php
Za tohle se taky přimlouvám. V aktuálním stavu je to v kombinaci s Nette a s Dibi nepoužitelné. Při spoustě věcí, které v běžně fungují to vrátí error. Momentálně jsem udělal úpravu, kterou navrhuje foglcz - $handler = defined('NETTE') ? NULL : set_error_handler(array($this, '_errorHandler'), E_ALL);.
+1 Též jsem musel opravit, jelikož při práce se soubory, kde se využívá například @fopen u cache, tak je to nepoužitelné.
Fixed, nove je k dispozici ->setErrorHandlingLevel
Při spolupráci knihovny s Nette a notORM, které využívá cache (a potlačuje chyby zavináčem) je potřeba obejít nastavení vlastního error handleru. Pro účely vyhození výjimky by plně stačilo použít error handler z Nette.
Tedy navrhuji úpravu souboru: Server.php (660)
$handler = set_error_handler(array($this, '_errorHandler'), E_ALL);
nahradit za:
$handler = defined('NETTE') ? NULL : set_error_handler(array($this, '_errorHandler'), E_ALL);