Problém při použití vlastního ErrorPresenteru

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

Č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
+
+2
-

tipuju, ze tu vyjimku vyhazujes v Front_BasePresenter. A error presenter, jelikoz dedi od teto tridy, tak ji vyhodi take…

MartinitCZ
Člen | 580
+
0
-

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
+
0
-

matej21: Máš samozřejmě pravdu, bylo to tím :)
MartinitCZ: Potřebuji v ErrorPresenteru nějaká data, která loaduju v Front_BasePresenteru. Protože i na chybové stránce chci zobrazovat menu, jestli je uživatel přihlášen atd..

Každopádně oběma díky.

Paimutan
Člen | 33
+
0
-

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
+
0
-

a nevyuziva ten error presenter onen model, co vyhazuje vyjimku?

Paimutan
Člen | 33
+
0
-

matej21: ne, ten error presenter nevyužívá žádný model. Pouze extenduje Front_BasePresenter.

Editoval Paimutan (6. 8. 2014 15:50)

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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“.