Laděnka vs. ErrorPresenter
- xificurk
- Člen | 121
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
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
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
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
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
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
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?
- romansklenar
- Člen | 655
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.