Problém při použití vlastního ErrorPresenteru
- Paimutan
- Člen | 33
Čaute,
nějak divně se mi chová Nette 2.0.5 při vyhození výjimky. Vždy dojde k chybě An error occurred while executing error-presenter
Vyprovokování výjimky v presenteru
Throw new \Nette\Application\BadRequestException("vyhozena chyba");
ErrorPresenter
namespace FrontModule;
class ErrorPresenter extends Front_BasePresenter
{
public function renderDefault($exception)
{
die('sem se to pri rucnim vyhozeni vyjimky nedostane');
if ($this->isAjax()) {
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof \Nette\Application\BadRequestException) {
$code = $exception->getCode();
$this->template->meta_title = 'Stránka nenalezena';
$this->template->meta_desc = $this->template->meta_title;
$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx');
// log to access.log
\Nette\Diagnostics\Debugger::log("HTTP code $code: {$exception->getMessage()} in {$exception->getFile()}:{$exception->getLine()}", 'access');
} else {
$this->setView('500'); // load template 500.latte
\Nette\Diagnostics\Debugger::log($exception, \Nette\Diagnostics\Debugger::ERROR); // and log exception
}
}
}
Podotýkám, že jinak ErrorPresenter funguje správně. Pokud např. zadám chybnou url, tak se to do tohoto ErrorPresenteru dostane a vše proběhne v pořádku. Problém je pouze pokud tu výjimku vyhazuju ručně viz výše.
Zkoušel jsem vyhodit i Throw new \Exception("vyhozena chyba")
pořád ale se stejným výsledkem.
Nakopněte mě někdo prosím, nebo se nakopnu sám .)
- David Matějka
- Moderator | 6445
tipuju, ze tu vyjimku vyhazujes v Front_BasePresenter. A error presenter, jelikoz dedi od teto tridy, tak ji vyhodi take…
- MartinitCZ
- Člen | 580
ErrorPresenter: Má být co nejvíc oddělen od aplikace.
Tzv. ErrorPresenter by měl dědit
od \Nette\Application\UI\Presenter
- Paimutan
- Člen | 33
Mám tu znovu stejný problém:
Tentokrát výjimku vyhazuju v modelu. Model nijak nedědí od
(Front_)BasePresenteru, přesto dochází k naprosto stejné chybě. Hlava mi
to nebere. Pokud výjimku vyhodím v kterémkoliv presenteru, k tomuto
zacyklení nedojde a vše je v pořádku.
Model vytvářím v Front_BasePresenteru
$this->catalogModel = $this->context->createCatalogModel();
tak nevím, jestli toto na to nemá nějaký vliv.
Editoval Paimutan (6. 8. 2014 15:48)
- David Matějka
- Moderator | 6445
v error presenteru proste nesmi dojit k chybe. tot vse. pokud tedy error presenter dedi od nejakyho base presenteru, ktery vyhazuje vyjimku, tak vyjimku vyhodi i error presenter. a pote vidis tu hlasku, kterou vidis..
- Paimutan
- Člen | 33
Ano, ale tady nedochází k chybě v žádném z base-presenterů. Tady
jí vyhazuju v modelu.
Chybové html laděnky vypadá tak, že jako „hlavní“ chyba je uvedeno to
„An error occurred while executing error-presenter“. Dole o kus níže je
pak vypsána ta chyba/výjimka, kterou jsem vyhodil v modelu.
- David Matějka
- Moderator | 6445
no a tam si muzes proklikat call stack – pokud ten model vytvaris v base presenteru, tak pravdepodobne nekde tam se taky zavola metoda, ktera vyhodi vyjimku…
Editoval matej21 (6. 8. 2014 16:09)
- Paimutan
- Člen | 33
Haluz, teď to při vyhazování výjimky z modelu jede. Přísahal bych, že to nejelo i když jsem promazával cache.
Takže update:
Stejný error pořád přetrvává, pokud v modelu zavolám metodu pomocné třídy (MSSQLErrorHandler), do které to vyhození výjimky deleguju. Přesunul jsem tedy vyhození výjimky do MSSQLErrorHandler::vyhodVyjimku()
Tato třída se injectuje přímo do modelu a nemá (neměla by) mít
s žádným presenterem nic společného.
Tato třída (ani nic s ní spojeného) se nijak nepoužívá
v ErrorPresenteru.
MODEL
public function simulateMSSQLException()
{
$this->MSSQLErrorHandler->vyhodVyjimku(); // deleguju do pomocne tridy
//Throw new \DatabaseErrorException('toto by fungovalo spravne');
}
MSSQLErrorHandler
Class MSSQLErrorHandler
{
public function vyhodVyjimku()
{
Throw new \DatabaseErrorException('vyhozena chyba'); // toto zkolabuje na zminene chybe
}
}
config
DatabaseErrorHandler:
class: \MSSQLErrorHandler
factories:
catalogModel: CatalogModel(@connection, @DatabaseErrorHandler)
Tedy pokud výjimku vyhodím přímo v modelu – je to ok. Pokud jí vyhodím „o krok dál“ – nastane ta chyba „an error while executing error presenter“.