ErrorPresenter – elementarny priklad
- tomolas
- Člen | 66
Zdravim vsetkych,
snazil som sa najst nejaky uplne jednoduchy priklad, alebo navod, ako na ErrorPresenter a nic som nenasiel.
Skusil som si prekopirovat ErrorPresenter.php zo Skeletonu do /presenters a vytvoril som si sablonu 404.phtml v /templates/Error a v bootstrap.php som nastavil:
<?php
Debug::enable(Debug::PRODUCTION, WWW_DIR . '/log.txt');
#Debug::enable();
Environment::loadConfig();
$application = Environment::getApplication();
$application->errorPresenter = 'Error';
?>
ked potom skusim nejake url, na ktore nemam route-u, ostane mi biela stranka a prazdny log. Ak necham v bootstrap.php Debug::enable(); zobrazi sa ladenka a chyba BadRequestException #404.
Viete ma prosim odkazat na nejaky tutorial o ErrorPresenteri? ..lebo toto vsetko len tusim a zistil som to utrzkovite z citania fora. Existuje nejaky navod, ako toto spravit? Vidite v mojom postupe nejaku chybu?
Vopred dakujem za pomoc!
- tomolas
- Člen | 66
Dakujem za odpoved, i ked je to dalsia utrzkovita informacia.
dostal som sa teda sem:
The server encountered an internal error and was unable to complete your request. Please try again later.
Log ostava prazdny.
Mne skor islo o to, ako to funguje. Alebo hladam nieco zlozite tam kde to nie je ?
Posle niekto dalsi riadok kodu? :) Mozno to na 20× dame dokopy :)
Editoval tomolas (22. 7. 2010 22:57)
- odin
- Člen | 50
tomolas napsal(a):
Dakujem za odpoved, i ked je to dalsia utrzkovita informacia.
Mne skor islo o to, ako to funguje. Alebo hladam nieco zlozite tam kde to nie je ?
Myslim, ze ano. Zasadni je radek $application->errorPresenter = ‚Error‘;, ktery aplikaci rekne, ze v pripade chyby ma zobrazit ErrorPresenter. Chyba = nejaka vyjimka. V pripade chybne cesty je to vyjimka BadRequestException, ale muze to byt skoro cokoliv jinyho.
No a ted prichazi na radu ten druhy radek:
$application->catchExceptions = true;
Ve vychozim stavu je ve vyvojovem prostredi nastaveno $application->catchExceptions = false; coz znamena, ze aplikace vyjimky nezachyti a ty probublaji az k poslednimu zachytnemu bodu – tj. Ladenka. To ma ten vyznam, ze pokud to na vyvojovem prostredi zhavaruje tak vidis celou chybu vcetne callstacku a tak.
Na produkcnim prostredi je ve vychozim stavu $application->catchExceptions = true, cili aplikace vyjimku zachyti a zobrazi ten slavny ErrorPresenter. Cili pokud chces ladit error presenter, tak si musis do bootstrap.php dat (docasne) $application->catchExceptions = false; aby ho to bralo vazne.
Potom si muzes vyvolat vyjimku treba tak ze zadas neexistujici URL anebo do nejake render metody placnes throw new RuntimeException(‚test‘); a melo by to zobrazit ErrorPresenter.
- Aurielle
- Člen | 1281
$app->catchExceptions = FALSE
znamená, že místo
ErrorPresenteru bude reagovat v dev prostředí Laděnka, v produkčním
prostředí defaultní error presenter Nette, tzn:
The server encountered an internal error and was unable to complete your
request. Please try again later.
Nette Framework
Pokud zapneš ErrorPresenter a catchExceptions a přesto dostáváš defaultní hlášku, tak to znamená, že máš v ErrorPresenteru něco, co ti způsobuje výjimku. Tu najdeš v logu…
- Vyki
- Člen | 388
Já tohoto vlákna lehce zneužiju pro svůj problém s Error presenterem. Nemáte někdo zkušenost s hláškou
[20-Jul-2010 15:15:20] PHP Fatal error: Uncaught exception 'ApplicationException' with message 'An error occured while executing error-presenter' in /hosting/www/example.com/www/application/libs/Nette/loader.php:688
Stack trace:
#0 /hosting/www/example.com/www/application/app/bootstrap.php(76): Application->run()
#1 /hosting/www/example.com/www/index.php(13): require('/hosting/www/ex...')
#2 {main}
Toto se mi zcela nepravidelně zapisuje do error logu na produkčním serveru. V API jsem si našel kde se ta hláška s vyjímkou volá, ale co ji způsobuje nemám tušení. Nesetkali jste se s tím někdo? Jinak error presenter mám v bootstrapu správně zaregistrovaný a čtyřstovky i pětistovky mi to vyhazuje podle očekávání, ale občas to prostě selže.
- Ondřej Mirtes
- Člen | 1536
Tahle chyba se vyhodí, pokud se nepovede spustit ErrorPresenter, tzn., že chyba je přímo v něm.
Zkontroluj si, jestli ta chyba, kterou odchytáváš, nenastává třeba v BasePresenteru, od kterého ErrorPresenter dědíš, nebo jestli chyba nespočívá třeba v připojení k databázi, jehož nepřítomnost shodí i ErrorPresenter.
Ke zprovoznění ErrorPresenteru pomáhá ho redukovat na nejmenší možnou část, tzn. dědit od Presenteru a šablony nechat samostatné, neodvozovat je od layoutu.
- tomolas
- Člen | 66
gmvasek napsal(a):
$app->catchExceptions = FALSE
znamená, že místo ErrorPresenteru bude reagovat v dev prostředí Laděnka, v produkčním prostředí defaultní error presenter Nette, tzn:The server encountered an internal error and was unable to complete your request. Please try again later.
Nette FrameworkPokud zapneš ErrorPresenter a catchExceptions a přesto dostáváš defaultní hlášku, tak to znamená, že máš v ErrorPresenteru něco, co ti způsobuje výjimku. Tu najdeš v logu…
Aj ked s opozdenim, dakujem za rady!
ta posledna citovana veta bola pre mna dolezita. Vsetko som mal spravne
nastavene, ale zabudol som v mojej chybovej sablone (404.phtml) zatvorit jeden
blok. Preto som stale dostaval default chybovu hlasku od Nette errorPresenter a
preto som tomu nerozumel.
Este raz diki za pomoc!