ErrorPresenter

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

Zdravím diskutijící!
Nevím, zda to je bug, nebo chyba u mě, takže to píšu do obecné diskuse a ne do bug reportu. ;)

Každopádně, mám nastaven $application->errorPresenter = ‚Error‘;, a v config.ini mám (provizorně, abych vyzkoušel, jak ErrorPresenter funguje) pro všechna prostředí mode.live = TRUE.

V normálním presenteru, pokud není nalezena položka, kterou chci zobrazit vyhodím BadRequestException a pak se stane, že v Application.php se na tomto místě: https://api.nette.org/…ion.php.html#197

se to dostane až k tomuto kódu elseif ($this->errorPresenter), který je vyhodnocen kladně, takže bych předpokládal, že dojde k reguestu na ErrorPresenter, ale ten se vůbec nedostane ke slovu a vypíše se to echo s chybou 500, co je pod těmi podmínkami:

<?php
echo "<title>500 Internal Server Error</title>\n\n<h1>Server Error</h1>\n\n", "<p>The server encountered an internal error and was unable to complete your request. Please try again later.</p>";
?>

Co dělám špatně? :)

Díky!

romansklenar
Člen | 655
+
0
-

Došlo ti tam k chybě při spouštění ErrorPresenteru. Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli které ti to nejde.

Tomik
Nette Evangelist | 485
+
0
-

romansklenar napsal(a):

Došlo ti tam k chybě při spouštění ErrorPresenteru. Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli které ti to nejde.

To je právě divný, protože Laděnka je zapnutá, pokud ji nechám logovat, log je prázdný a defaulně ji pouštím do fireBugu a ten taky mlčí… Tak nevím.

Tomik
Nette Evangelist | 485
+
0
-

romansklenar napsal(a):

Došlo ti tam k chybě při spouštění ErrorPresenteru. Musíš nahodit laděnku (pokud loguješ, mrkni do logu na Exepšny) a podívat na část ‚Caused-By‘ tušímže a tam najdeš přesně výjimku, kvůli které ti to nejde.

A pokud pustím ErrorPresenter ručně – tedy pustím jej normálně přes request a předám mu jako výjimku BadRequestException, potom funguje normálně, to je o důvod víc, proč se domnívat, že chyba není v něm. Resp. ten error presenter má takovýto kód:

<?php
class ErrorPresenter extends BasePresenter
{
	public function renderDefault($exception)
	{
		if ($this->isAjax()) {
			$this->payload->error = $exception->getMessage();
			$this->terminate();

		} else {
			$this->template->robots = 'noindex,noarchive';

			if ($exception instanceof /*Nette\Application\*/BadRequestException) {
				Environment::getHttpResponse()->setCode(404);
				$this->template->title = '404 Not Found';
				$this->changeView('404');

			} else {
				Environment::getHttpResponse()->setCode(500);
				$this->template->title = '500 Internal Server Error';
				$this->changeView('500');

				/*Nette\*/Debug::processException($exception);
			}
		}
	}

}
?>

Je tam chyba? A pokud ne, kde jinde by mohla být chyba?

Díky za pomoc!

PetrP
Člen | 587
+
0
-

Podíval bych se jestli není problém v BasePresenteru vyskoušel bych co se stane kdyz budu dědit přímo od Presenter.

Tomik
Nette Evangelist | 485
+
0
-

PetrP napsal(a):

Podíval bych se jestli není problém v BasePresenteru vyskoušel bych co se stane kdyz budu dědit přímo od Presenter.

Díky! Pomohlo. bylo to způsobené tím, že jsem měl v BasePresenteru Environment::getSession()->start();, nevím, proč to tam vadilo, ale už to tam není, funguje to i bez toho a funguje i ErrorPresenter, takže díky moc!

A.
Člen | 87
+
0
-

Myslim, ze to souvisi s chybou, kterou jsem psal zde. Pricinu se mi zatim ale zjistit nepodarilo.

Editoval A. (27. 11. 2008 18:05)

David Grudl
Nette Core | 8218
+
0
-

Session není možné startovat dvakrát (tedy je, ale musí se předtím manuálně uzavřít). Tudíž bych $session->start() změnil třeba na if (!$session->isStarted()) $session->start();

Tomik
Nette Evangelist | 485
+
0
-

David Grudl napsal(a):

Session není možné startovat dvakrát (tedy je, ale musí se předtím manuálně uzavřít). Tudíž bych $session->start() změnil třeba na if (!$session->isStarted()) $session->start();

Ha! Díky… :)