ErrorPresenter – elementarny priklad

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

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!

Patrik Votoček
Člen | 2221
+
0
-
$application->catchExceptions = TRUE;
tomolas
Člen | 66
+
0
-

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)

redhead
Člen | 1313
+
0
-

Tak to možná funguje, tohle vypisuje ErrorPresenter ;)

odin
Člen | 50
+
0
-

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
+
0
-

$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
+
0
-

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
+
0
-

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.

Vyki
Člen | 388
+
0
-

Ona ta chyba nastává jenom občas. Když simuluji chybu 500 i 400 tak to funguje a chybové view 500 a 400 to v pořádku zobrazí, ale dám na Ondrovu radu s tou jednoduchostí. Podědím Presenter místo basePresenteru a nebudu v šabloně dědit layout, snad to pomůže. Díky za radu.

tomolas
Člen | 66
+
0
-

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 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…

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!