Chyba v konponente (Control) neskončí v ErrorPresenter

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

Ahoj, mám problém so zachytávaním chýb do ErrorPresentru. Ak vyvolám výnimku v ktoromkoľvek presenteri skončí tak ako má a zobrazí sa ErrorPresenter. Ak ale vyhodím výnimku vo vykreslitelnej komponente stránka sa vykreslí až po miesto kde vznikne chyba v komponente a vypíše sa štandardná chybová hláška:

Server Error

The server encountered an internal error and was unable to complete your request. Please try again later.
Nette Framework

Hľadal som na fóre či niekto neriešil podobný problém ale nič som nenašiel. Neviete v čom môže byť problém? Predpokladal som že každú chyba skončí v ErrorPresenteri. Zrejme niekde robím chybu.

Príklad: na stránke mám 4 komponenty, keď v tej poslednej vyhodím výnimku, prvé tri sa vykreslia a namiesto poslednej je vypísaná uvedná chyba.

bootstrap.php:
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;

Presenter:
public function renderDefault()
{
    .
    .
    $articleBox = new ArticlesBox;
    $this->addComponent($articleBox, 'articleBox');
    $tournamentBox = new TournamentsBox;
    $this->addComponent($tournamentBox, 'tournamentBox');
    $slideshowGallery = new SlideshowGallery;
    $this->addComponent($slideshowGallery, 'slideshowGallery');
}

template:
{block content}
{widget articleBox}
{widget tournamentBox 'next'}
{widget tournamentBox 'last'}
{widget slideshowGallery}


Komponenta:
class SlideshowGallery extends Control
{
    public function render()
    {
        throw new exception('chyba');
    }
}

Nette 0.9.7 + PHP 5.2.14

Filip Procházka
Moderator | 4668
+
0
-

když přejdu fakt že komponenty připojuješ opravdu zvláštním způsobem a v maximálně nevhodnou dobu (vsadím boty že ti nefungují signály na komponenty), tak mi už zbývá jenom ti sdělit, že to je naprosto normální chování.

Jak chceš přesměrovávat na ErrorPresenter, když už jsi vykreslil kus stránky?

Musíš si sám zařídit obsluhu komponenty tak, aby když nastane chybový stav, vypsala chybu a nezabíjela celou stránku. Nebo by možná bylo asi ideální, udělat si šablonu, pro takové případy. Ve které bude nastylovaný div, který ti překryje celou stránku, a bude v něm zpráva o chybě vykreslování.

Každopádně tohle nelze vyřešit perfektně, jediné řešení je napsat komponenty tak, aby se samy obsloužily a místo vyjímek, nebo svého obsahu, vypsaly chybu, nebo mlčely.

Samozřejmostí je vyjímky logovat…

public function render()
{
	try {
		// muj kod ...
		$this->template->render();

	} catch(SakraVyjimkaException $e) {
		Nette\Debug::::log($e, Debug::ERROR);

		// buď si udělám tu šablonu, která mi překryje celou, prozatím vykreslenou, stránku
		$template = clone $this->presenter->template;
		$template->setFile(APP_DIR.'/templates/@error.phtml');
		$template->error = $e->getMessage();
		echo $template;
		$this->presenter->terminate();

		// nebo ("malichernou") chybu vypíšu
		$p = Nette\Web\Html::el('p');
		$p->setText('Došlo k chybě vykreslování: '.$e->getMessage());
		echo $p;

		// nebo se na to vykašlu ...
		$this->terminate();
	}
}
p3s
Člen | 8
+
0
-

Diky za odpoved, je mi to jasne. Co sa tyka pripajania komponent, inspiroval som sa prikladom k VisualPaginatoru, ale ako teraz pozeram tym starsim, povodnym sposobom. Kedze komponenty sa len vykresluju, problem so signalmi sa nevyskytol.