ErrorPresenter a zachytávání výjimek

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
tobice
Člen | 30
+
0
-

Úplně si nerozumím s ErrorPresenterem. Když někde vyhodím výjimku BadRequestException s 404 kódem, ale jsem v debug modu, tak se ErrorPresenter úplně ignoruje a místo toho se vypíše klasický stacktrace a vše okolo (možná dělám něco špatně). Technicky vzato 404 ale není úplně chyba programátora či chyba v kódu, ale prostě špatné vstupní parametry. A já bych chtěl při vyhození BadRequestException s 404 kódem vypsat prostě obyčejnou 404 stránku. Vypínat kvůli tomu Debugmod, jen abych to otestoval, mi nepřijde nejšťastnější.

Zdá se mi, že ErrorPresenter je zamýšlen skutečně jen na pokrytí kritických chyb, ke kterým by typicky nemělo vůbec docházet. Nicméně já bych rád pomocí výjimek řešil i takové případy, kdy se uživatel pokusí načíst z databáze neexistující objekt (neplatná vstupní data). V každé akci každého presenteru neustále dokola kontrolovat, že objekt byl korektně načten, to mi přijde zdlouhavé. Proto bych rád prostě v modelu vyhodil nějakou obecnou výjimku (ObjectNotFoundExcepction extends BadRequestException), v presenteru možnost chyby zcela ignoroval a výjimku zachytil a zpracoval až na nějaké vyšší úrovni, právě ideálně v ErrorPresenteru.

Editoval tobice (11. 7. 2013 10:17)

David Matějka
Moderator | 6445
+
0
-

k tomu slouzi Nette\Application\Application::$catchExceptions

kdyz das do neonu

nette:
	application:
		catchExceptions: true

tak by se mely zachytit i v debug modu. to, ze se v debug modu defaultne pri 404 vyhodi ladenka, je spravne :)

tobice
Člen | 30
+
0
-

Díky :) ale pořád to není ideální… takhle se mi nezobrazí laděnka pro vůbec žádné výjimky. Chtěl bych to tak, abych určité výjimky si odchytil sám (NotFoundException) a ty, co bych neodchytil, by byly zpracovány standardně laděnkou…

David Matějka
Moderator | 6445
+
0
-

a neni to v debug modu jedno? :) na produkci pujde na error presenter vsechno, na debugu je imho lepsi kdyz zas vidis ladenku vzdycky (krome pripadu, kdy vytvaris error presenter a potrebujes ho vyzkouset :) ). ale funkcni reseni by mohlo byt zhruba takovy:

//bootstrap.php za vytvorenim containeru
$container->application->onError[] = function(Nette\Application\Application $application, Exception $e) {
	$application->catchExceptions = $e instanceof Nette\Application\BadRequestException;

};
tobice
Člen | 30
+
0
-

Je fakt, že to ničemu ve skutečnosti nevadí :) Člověk laděnku vypne, aby vyzkoušel, že jsou výjimky dobře zachytávány, ale jinak je rád, že je zapnutá :) Díky za rady.