Laděnka vs. ErrorPresenter

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

Na produkčním serveru očekávám, že pokud nastane nějaká chyba, tak se web hezky návštěvníkovi omluví. Proto jsem si nastavil $application->errorPresenter a $application->catchExceptions = TRUE.

Problém je ale ten, že by se hodilo zároveň logovat errory, abych se vůbec dozvěděl, že je na webu někde něco blbě. Jenže s takovýmto nastavením errorPresenter požere všechny vyhozené výjimky.

Otázka tedy zní, kde zachycenou výjimku znova vyhodit, tak aby to celé znova nebylo požráno aplikací a díky tomu nezkolabovalo další výjimkou ‚Cannot load error presenter‘?

Editoval xificurk (12. 8. 2008 18:20)

David Grudl
Nette Core | 8218
+
0
-

Jsou dvě možnosti: buď ErrorPresenter vypne catchExceptions a vyhodí znovu výjimku, nebo, a to mi připadá rozumnější, ji předá logovacímu zařízení. Tím může být i Laděnka:

class ErrorPresenter

    protected function shutdown()
    {
        $exception = $this->params['exception'];
        Debug::exceptionHandler($exception); // pozor, volá exit()
    }

}
romansklenar
Člen | 655
+
0
-

Jak tedy řešíte předávání chyby ErrorPresenteru? Nebo spíš při jakých chybách dojde na jeho činnost?

Mám-li například presenter pro zobrazení obsahu článku

public function actionDefault($id)
{
	$post = new Posts;

	// ziskani obsahu clanku
	$p = $post->fetch(array('name%s' => $id));
	if ($p) {
        	$this->template->title = $p['title'];
		$this->template->post  = $p['content'];

	} else {
		throw new BadRequestException('An error occured while executing presenter - page not found');

		// $this->changeView('notfound'); takhle by to sice bylo asi čistější, ale mě teď zajímá jak se chyba přenese a zpracuje v ErrorPresenteru
	}

}

pak mi smyčka do proběhne jednou celá a podruhé se zastaví na řádku 207 , v produkčním režimu se zobrazí bílá prázdná obrazovka, což nemá pro návštěvníka žádnou vypovídající hodnotu a chtělo by to spíš zobrazit omluvu.

V bootstrapu mám:

$application->errorPresenter = 'Error';
$application->catchExceptions = TRUE;

a ErrorPresenter má stejnou podobu jako napsal David.

A tak se ptám – jdu na to špatně?

Taky bych rád zobrazil při těchto chybách nějakou její hezčí grafickou podobu, jen nemám žádný nápad jak nějak čistě zrealizovat.

Ještě jednu věc jsem v rámci tohoto problému nepobral, a to je parametr onError opět třídy Application. Byl by nějaký přiklad s jeho použitím?

David Grudl
Nette Core | 8218
+
0
-

To, co popisuješ, je situace, kdy se nepodařilo spustit error-presenter a došlo k nouzovému ukončení applikace. Takže nastartuj Laděnku a podívej se na „previous“ exception.

romansklenar
Člen | 655
+
0
-

Děkuju za tip, chyba odstraněna, laděnka opět ukázala svou sílu :)

Narazil jsem ale na to, že nynější podoba třídy ApplicationException se v php 5.2.x neprokouše NetteLoaderem (asi mu vadí ty podmínky? nebo si to přelouská jako 2× nadefinovanou třídu?) a tak se nekešuje v cache-Nette.RobotLoader. (zkoušel jsem to i na příkladech z distra a zvlášť Nette ze svn i z archívu)

Ještě jsem si všiml, že v NetteLoaderu u seznamu souborů pro autoload jsou 3 soubory které neexistují (budoucí/dávná implementace?)

'datagrid' => '/Application/UI/DataGrid.php',
'datagridcolumn' => '/Application/UI/DataGridColumn.php',
'dibistorage' => '/Caching/DibiStorage.php'
David Grudl
Nette Core | 8218
+
0
-

romansklenar napsal(a):

Děkuju za tip, chyba odstraněna, laděnka opět ukázala svou sílu :)

Narazil jsem ale na to, že nynější podoba třídy ApplicationException se v php 5.2.x neprokouše NetteLoaderem (asi mu vadí ty podmínky? nebo si to přelouská jako 2× nadefinovanou třídu?) a tak se nekešuje v cache-Nette.RobotLoader. (zkoušel jsem to i na příkladech z distra a zvlášť Nette ze svn i z archívu)

Máš pravdu, přidal jsem do Application.php natvrdo require.

Ještě jsem si všiml, že v NetteLoaderu u seznamu souborů pro autoload jsou 3 soubory které neexistují (budoucí/dávná implementace?)

Máš postřeh ;) To jsou třídy, kde stále váhám se zařazením do distribuce.

romansklenar
Člen | 655
+
0
-

Sice je už OT, ale: nejedná se o něco takovéhodle? UI/DataGrid nebo mtform tzn. implementaci formulářů pro přehledové tabulky např v administracích s různými ovládacími prvky, filtračními políčky aspol?

David Grudl
Nette Core | 8218
+
0
-

jj

romansklenar
Člen | 655
+
0
-

Uvažoval jsem právě taky na něčem takovém, co by usnadnilo tvorbu administrace, protože mě to vždycky prudí a chce se mi to dělat nejmíň na celém webu.

Pokud je nechceš zveřejňovat nebo zařazovat do distribuce, ale nevadil by ti testing, tak bych je i vyzkoušel.