foglcz / JSONRpc2

Generic JSON-RPC v2 implementation
Other
19 stars 10 forks source link

Nette + notORM #1

Closed ondrej-tuhacek closed 10 years ago

ondrej-tuhacek commented 12 years ago

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);

foglcz commented 12 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.

ondrej-tuhacek commented 12 years ago

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

sonnyCZE commented 11 years ago

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);.

frosty22 commented 11 years ago

+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é.

foglcz commented 10 years ago

Fixed, nove je k dispozici ->setErrorHandlingLevel