ErrorPresenter a zachytávání výjimek
- tobice
- Člen | 30
Ú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
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 :)
- David Matějka
- Moderator | 6445
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;
};