error presenter se nenačítá
- SyXcz
- Člen | 75
Zdárek,
mám problém, po zadání např
example.com/presenter/nějaká_blbost_která_neexistuje, se mi nenačte error
presenter, ale prachobyčejná PHP chyba že neexistuje template
„presenter/nějaká_blbost_která_neexistuje“ atd… atd…
mám nastavený error presenter v bootstrapu takto:
<?php
// Step 3: Configure application
// 3a) get and setup a front controller
$application = Environment::getApplication();
$application->errorPresenter = ':Www:Error';
$application->catchExceptions = FALSE;
?>
zkoušel jsem i jen „Error“ a různý kombinace a pořát nic…
a ještě dotaz… je možné na různých modulech mít i různé error presentery?
- Mikulas Dite
- Člen | 756
$application->catchExceptions = TRUE;
Jestli jde pro moduly, to si nejsem úplně jistý. Třeba to odkázat na centrální a ten se potom rozhodne kam přesměruje?
- Ondřej Mirtes
- Člen | 1536
$application->catchExceptions = Environment::isProduction();
Doma uvidíš krásně vybarvenou výjimku, uživateli na produkčním serveru se načte ErrorPresenter. Pro jeho testování můžeš tuhle proměnnou nastavit na true, na ostrý server ale ponech tohle nastavení :)
Pro jiné moduly můžeš zkusit proměnnou errorPresenter nastavovat ve startupu BasePresenteru daného modulu, ale nejsem si jistý, že to bude fungovat, jak má.
Editoval Ondřej Mirtes (30. 3. 2010 11:03)
- SyXcz
- Člen | 75
Mikulas Dite napsal(a):
$application->catchExceptions = TRUE;
Jestli jde pro moduly, to si nejsem úplně jistý. Třeba to odkázat na centrální a ten se potom rozhodne kam přesměruje?
to ani nevim proč sem tam měl FALSE :) možná jsem dřív testoval… ale stejně to pořát nejede… sice už nevidim php chyby… zobrazí se mi 500 internal server error, v templatě mam uplně něco jinýho… :(
Server Error
The server encountered an internal error and was unable to complete your request. Please try again later.
Nette Framework
a moje templata pořát zůstává chudinka nepoužitá… :(
- Ondřej Mirtes
- Člen | 1536
Protože je nějaká chyba v tom tvém ErrorPresenteru. Máš nastavené Debug::DETECT? Pak by se ti ve složce app/log měla objevit vyexportovaná výjimka.
- SyXcz
- Člen | 75
zkusil jsem ho v bootstrapu nastavit, ale v logu nikde nic :(
error presenter mam základní tak jak byl ve skeletonu, jediný co jsem
měnil bylo HTML v šablonách ale to nemůže mít vliv…
ErrorPresenter.php
<?php
class Www_ErrorPresenter extends BasePresenter
{
/**
* @param Exception
* @return void
*/
public function renderDefault($exception)
{
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof BadRequestException) {
$this->setView('404'); // load template 404.phtml
} else {
$this->setView('500'); // load template 500.phtml
Debug::processException($exception); // and handle error by Nette\Debug
}
}
}
?>
- Ondřej Mirtes
- Člen | 1536
A když ho podědíš jen od Presenter?
Navíc default view ti tam nikdy nenastane, se podívej na kód toho ErrorPresenteru – budeš mít Error.404.phtml anebo Error.500.phtml ;)
BTW: Trochu jsem se spletl, aby ti Laděnka ukládala log, musíš jí nastavit do módu Debug::PRODUCTION – Debug::DETECT se rozhoduje podle Environment::PRODUCTION (anebo DEVELOPMENT), což je něco jiného a přenastavením catchExceptions to neovlivňuješ.
- SyXcz
- Člen | 75
Ondřej Mirtes napsal(a):
A když ho podědíš jen od Presenter?
Navíc default view ti tam nikdy nenastane, se podívej na kód toho ErrorPresenteru – budeš mít Error.404.phtml anebo Error.500.phtml ;)
BTW: Trochu jsem se spletl, aby ti Laděnka ukládala log, musíš jí nastavit do módu Debug::PRODUCTION – Debug::DETECT se rozhoduje podle Environment::PRODUCTION (anebo DEVELOPMENT), což je něco jiného a přenastavením catchExceptions to neovlivňuješ.
psal jsem, že jsem celý ErrorPresenter vyprázdnil, aby se mi načítal default.phtml, ale nepomáhá…
i když si nastavim Debug::PRODUCTION tak v logu nic neni… asi to nebudu zatim řešit, zas tak akutní to neni, časem se to třeba vyřeší :o)
- repli2dev
- Člen | 57
Setkal jsem se s velice podobnou chybou, u které jsem nakonec zjistil chybu v ErrorPresenteru, který nešel vytvořit, protože vyhazoval chybu, kvůli chybějící komponentě.
Ke zjištění je potřeba nastavit debugování a (dle mého bádání) je
nutné uvést logovací soubor:
bootstrap.php
Debug::enable(Debug::PRODUCTION, './app/log/error.log');
Editoval repli2dev (7. 6. 2010 9:51)
- Pavelhajek
- Člen | 2
Spravny tvar by mel byt
<?php
// Step 3: Configure application
// 3a) get and setup a front controller
$application = Environment::getApplication();
$application->errorPresenter = 'Www:Error';
$application->catchExceptions = FALSE;
?>
Ted jsem resil stejny problem :)
- snakey
- Člen | 3
Ahoj,
i přesto že jsem prošel všechny topicy týkající se error presenteru,
nepodařilo se mi vyřešit můj problém – tedy to, že se error presenter
nikdy nespustí.
Mám aplikaci rozdělenou do více modulů. Jeden z nich je FrontModule.
výňátek bootstrap (řádky nejdou ve skutečnosti za sebou tak jako níže, píšu jen ty co považuji za důležité v kontextu problému):
<?php
NDebug::enable(NEnvironment::PRODUCTION, null, null);
$application->errorPresenter = 'Front:Error';
?>
Vlastní error presenter už jsem osekal do této podoby:
<?php
final class Front_ErrorPresenter extends NPresenter
{
public function renderDefault($exception)
{
$this->setLayout(false);
}
}
?>
Ve složce templates mám pak Error/view.phtml a Error/default.phtml s obyčejným HTML
Přesto pokud zadám neexistující URL dostanu defaultní Nette error 500. Pokud to nechám zachytávat laděnku, dostanu (správně) NBadRequestException. Log taktéž nezachytává nic zajímavého ([2011–02–08 00–43–50] PHP Fatal error: Uncaught exception NBadRequestException with message ‚Cannot load presenter 'Front:blbost‘, class ‚Front_BlbostPresenter‘ was not found in … )
Za zajímavé považuju, že pokud v bootstrap změním error presenter na nějakou blbost a do prohlížeče zadám URL Error presenteru, zobrazí se to co má, ale pokud je nastaven v bootstrap správně, dostanu pětistovku.
Díky za každou radu.
- Martin
- Člen | 171
Zdar všem. Měl jsem podobný problém, řešení uvádím pro stejné začátečníky, jako jsem já, aby to nemuseli absolvovat od začátku. Vše jsem dělal podle příkladů a postupně nastalo:
1. Zareagovala Laděnka, při jejím vypnutí „ošklivý“
Error
Oprava v bootstrap.ini:
<?php
$application = Environment::getApplication();
...
$application->errorPresenter = 'Front:Error';//Nebo kde máte ErrorPresenter
$application->catchExceptions = TRUE;//Vynutí ve všech režimech
?>
a okopírovat ErrorPresenter.php např. takto
<?php
namespace FrontModule;
use Nette\Debug,
Nette\Application;
/**
* Error presenter.
*
* @author John Doe
* @package MyApplication
*/
class ErrorPresenter extends BasePresenter
{
/**
* @param Exception
* @return void
*/
public function renderDefault($exception)
{
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof Application\BadRequestException) {
$code = $exception->getCode();
Debug::barDump(array('Error' => $code));//Pokud se chci ujistit, že mi to tudy chodí
$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'); // load template 403.latte or 404.latte or ... 4xx.latte
} else {
$this->setView('500'); // load template 500.latte
Debug::log($exception, Debug::ERROR); // and log exception
}
}
}
?>
2. ErrorPresenter zafungoval, 404.latte nenalezeno (stále se
objevovala chyba 500 z Nette)
Taková hloupá chybička, ale hodnou chvíli mi trvalo, než mi to došlo (tedy
až po výpisu přímo v Nette\Application\Presenter.php v metodě
sendTemplate()). Zcela v souladu s konvencí musí být v mém případě
(ostatní si cesty upraví podle nastavení) chybové templaty v souborcech
app\FrontModule\templates\Error\4xx.latte, popřípadě
app\FrontModule\templates\error.4xx.latte, nebo se musí
nastavit jiné cesty pro robotLoader, případně použít kompletní cesta
v setView().
3. Poslední drobnost – po dopsání výše uvedeného vymazat Cache
Editoval Martin (19. 3. 2011 22:28)
- fak
- Člen | 48
Mám stejnej problém a hází mi to exception do logu:
Page not found. Missing template ‚…/FrontModule/templates/Error/xx.phtml‘.
tj metoda renderDefault se vůbec nespouští. nechápu:(
EDIT:
pomohlo, když jsem natvrdo do Error presenteru vložil:
public function beforeRender(){
parent::beforeRender();
$this->setView('default');
}
Editoval fak (13. 4. 2011 13:18)
- josef.sabl
- Člen | 153
Mám stejný problém. Error presenter se vůbec nespustí. Aplikace je podle klasického skeletonu ve verzi 2.0 beta. Nepoužívám moduly.
bootstrap.php
<?php
Debugger::enable(Debugger::PRODUCTION);
$application = $container->application;
$application->errorPresenter = 'Error';
$application->catchExceptions = Environment::isProduction();
?>
ErrorPresenter.php
<?php
use Nette\Diagnostics\Debugger,
Nette\Application as NA;
class ErrorPresenter extends Nette\Application\UI\Presenter
{
/**
* @param Exception
* @return void
*/
public function renderDefault($exception)
{
if ($this->isAjax())
{ // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
}
elseif ($exception instanceof NA\BadRequestException)
{
$code = $exception->getCode();
$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx'); // load template 403.latte or 404.latte or ... 4xx.latte
}
else
{
$this->setView('500'); // load template 500.latte
Debugger::log($exception, Debugger::ERROR); // and log exception
}
}
}
?>
V error.log není nic, kromě výjimky, která mě zajímá a kterou chci zachytit a oznámit ErrorPresenterem uživateli.
Pokud se pokusím odkázat na samotný presenter a zobrazit jej jako stránku (n:href=‚Error:‘). Aplikace hodí výjimku „Invalid request. Presenter is not achievable.“ Což je podle zdrojáků zřejmě žádaná akce, tzn. Error presenter by se neměl spouštět napřímo (Jen, jestli tím autor chtěl říci, že Presenter není dostupný, byl by lepší překlad „Presenter is not reachable“ nebo možná „available“ :-)
Pokud zakomentuju řádek, kde aplikaci „naučím“, že Error je její chybový presenter. Stránka s Errorem se bez jakéhokoli problému zobrazí.
Z toho usuzuju, že odkaz na presenter mám v aplikaci nastaven správně.
Jsem z toho docela zoufalej. Potřebuju nutně a nedaří se mi to vyřešit. Prosím o jakoukoli pomoc.
Editoval josef.sabl (12. 12. 2011 16:20)
- josef.sabl
- Člen | 153
bojovyletoun napsal(a):
no jediný řešení asi bude odstranit řádek obsahující „ieva“.
WTF? :-)
- bojovyletoun
- Člen | 667
no prostě se v nette frameworku smaž rádek obsahující ieva. Ale podle mě je tohle omezení čistě jen kvůli tomu, aby nešel spouštět EP jen tak pro nic za nic.
- josef.sabl
- Člen | 153
bojovyletoun napsal(a):
no prostě se v nette frameworku smaž rádek obsahující ieva. Ale podle mě je tohle omezení čistě jen kvůli tomu, aby nešel spouštět EP jen tak pro nic za nic.
Jo, to jsem pochopil. Ale to není přeci vůbec můj problém :-) Na tohle jsem narazil, když jsem se snažil testovat Error presenter, jestli neobsahuje chybu. A psal jsem to sem jako „důkaz“, že mám Error presenter správně nastavený, když samotný framework detekuje, že jde o Error presenter. A taky možná jako jemnou výzvu na opravu ne-angličtiny :-)
Můj problém je, že se Error presenter nespustí ve chvíli, když
například v jiném presenteru zavolám throw new Exception()
.
Krachne mi to do error.phtml nebo jak se jmenuje ten soubor ponořený někde
v hloubi Nette.
Možná se to tak má chovat nebo dělám něco špatně, ale nečekal bych to a lidi výše to taky očividně řeší.
Díky moc…
PS: Omylem jsem tě místo odpovědi dal nahlásit, tak když tě zabanánujou, tak víš, kdo za to může :-D
- dodik
- Člen | 10
Este stale sa nevyriesil problem s vlastnou 500 ?
Prebehol som vela postov s tymto problemom a stale to nieje nikde
vyriesene.
Bezim na Nette 2.0.6 a mam nezmeneny ErrorPresenter.
404 mi funguje cez EP, ale pri 500 sa EP vobec nezavola (tak ako u vsetkych
co tento problem riesia).
Nejake nove napady/riesenia?
Dakujem
- woytam
- Člen | 14
Provedl jsem přechod z verze 2.0beta na 2.0.6, provedl úpravy, zkopíroval ErrorPresenter a jeho šablony včetně @layout a nakonfiguroval config.neon:
common:
nette:
application:
errorPresenter: Error
a zobrazuje mi to jak Error 400, tak i 500 – jen je třeba upravit šablonu u 500, aby se poznalo, zda se jedná o vlastní nebo původní šablonu, protože ta nenačítá layout.
EDIT
Týká se ručně vyhozených výjimek a zdá se, že některých dalších
(PDO), ale všechny to nebere – Fatal error.
Editoval woytam (17. 11. 2012 13:48)
- ajda2
- Člen | 66
Zdravím všechny,
měl jsem stejný problém a konečně sem ho vyřešil!
Error presenter mám ve FrontModule, to je v bootstrapu/config.neon potřeba nastavit takto
<?php
$container->application->errorPresenter = 'Front:Error';
?>
Bez dvojtečky na začátku. Cesta se bere vždy absolutně, ikdyž se výjimka vyhodí v jiném modulu.
Rodič Error Presenteru musí být zapsán absolutně s lomítkem na začátku:
<?php
namespace FrontModule;
use Nette\Diagnostics\Debugger;
class ErrorPresenter extends \FrontModule\BasePresenter
{...}
?>
Toto řešení mi funguje.
Je sice společný Error Presenter pro Front i Admin, ale to už je pro mě
detail a budu řešit někdy jindy.
Opravdu stačí projít logy a zjistit, kde je chyba :)
Pak si nezapomeňte změnit šablony, ať si vůbec všimnete, že je použit
správný presenter.
- ziki
- Člen | 2
Zdravím, mám podobný problém, taky se mi někdy nenačítá Error presenter, ale závisí to na druhu chyby – pokud použiju URL která neodpovídá ničemu v routeru, správně se spustí Error presenter a vypíše stránku 404.
Když ale udělám nějakou chybu jinde (např. v Homepage presenteru zavolám funkci, která není definovaná), místo Error presenteru se zobrazí defaultní Nette error stránka z libs/Nette/Diagnostics/templates/error.phtml. Nenapadá Vás co s tím ?
A druhá věc – pokud udělám chybu v komponentě a spustím to, kód stránky se vypíše až než dojde na zobrazní komponenty – zde se pak vypíše chyba. Je možné toto nějak ošetřit předem, aby pokud nastane chyba v některé z komponent se stránka vůbec nerenderovala a rovnou se přešlo na Error 500 ?
- n.u.r.v.
- Člen | 485
Ahoj, také mi nejde error presenter – když vyhodím vlastní vyjímku, hodí se chyba 500, ale ne ta z errorpresenteru
Errorpresenter:
<?php
use Nette\Diagnostics\Debugger;
/**
* Error presenter.
*/
class ErrorPresenter extends BasePresenter {
/**
* @param Exception
* @return void
*/
public function renderDefault($exception) {
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
$this->terminate();
} elseif ($exception instanceof Nette\Application\BadRequestException) {
$code = $exception->getCode();
// load template 403.latte or 404.latte or ... 4xx.latte
$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx');
// log to access.log
Debugger::log("HTTP code $code: {$exception->getMessage()} in {$exception->getFile()}:{$exception->getLine()}", 'access');
} else {
$this->setView('500'); // load template 500.latte
Debugger::log($exception, Debugger::ERROR); // and log exception
}
}
}
bootstrap:
<?php
// Load Nette Framework or autoloader generated by Composer
require __DIR__ . '/../libs/autoload.php';
$configurator = new Nette\Config\Configurator;
$configurator->setDebugMode(FALSE);
// Enable Nette Debugger for error visualisation & logging
$configurator->enableDebugger(__DIR__ . '/../log');
// Specify folder for cache
$configurator->setTempDirectory(__DIR__ . '/../temp');
// Enable RobotLoader - this will load all classes automatically
$configurator->createRobotLoader()
->addDirectory(__DIR__)
->addDirectory(__DIR__ . '/../libs')
->register();
// Create Dependency Injection container from config.neon file
$configurator->errorPresenter = 'Error';
$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon', $configurator::NONE); // none section
$container = $configurator->createContainer();
\Nette\Diagnostics\Debugger::$bar->addPanel(new SessionPanel($container->session));
Kdyby\BootstrapFormRenderer\DI\RendererExtension::register($configurator);
return $container;
config.neon:
common:
parameters:
php:
date.timezone: Europe/Prague
# zlib.output_compression: yes
nette:
application:
errorPresenter: Error
database:
atd...
Nevíte co s tím? díky
Edit: error presenter je v app/presenters/errorPresenter.php
Tepmlate je v app/templates/error/xxx.latte
Editoval n.u.r.v. (10. 7. 2013 14:32)
- jiri.pudil
- Nette Blogger | 1032
Co to je?
Máš v ErrorPresenteru nějakou chybu. Zkus v bluescreenu Laděnky najít sekci Caused by.
- jiri.pudil
- Nette Blogger | 1032
V tom případě si myslím, že tvůj ErrorPresenter dědí od BasePresenteru a ten kód vyhazující výjimku (btw, první dlouhé, druhé krátké) se v něm vykoná taky. Jenže ErrorPresenter je poslední instance: když se v něm vyskytne chyba, Nette už ji nemá kam dál předat.
- n.u.r.v.
- Člen | 485
Mno error presenter je původní – na něj jsem nesahal (teprve se chystám), ale právě potřebuji ručně v base presenteru při jisté situaci vyhodit výjimku. Mno takže když zruším v error presenteru dědění od basepresenteru, tak by to mělo jít? Zkusím…
Editoval n.u.r.v. (11. 7. 2013 20:09)
- simPod
- Člen | 383
Co dělám špatně?
Boostrap:
$application = $container->application;
$application->errorPresenter = 'Front:Error';
//$application->catchExceptions = !Nette\Config\Configurator::detectDebugMode();
$application->catchExceptions = TRUE;
ErrorPresenter:
<?php
namespace FrontModule;
use Nette\Diagnostics\Debugger;
class ErrorPresenter extends \Nette\Application\UI\Presenter {
/**
* @param Exception
* @return void
*/
public function renderDefault($exception) {
if ($this->isAjax()) { // AJAX request? Just note this error in payload.
$this->payload->error = TRUE;
Debugger::fireLog($exception->getMessage());
$this->terminate();
} elseif ($exception instanceof \Nette\Application\BadRequestException || $exception instanceof Nette\Application\BadRequestException) {
$code = $exception->getCode();
// load template 403.latte or 404.latte or ... 4xx.latte
list($module) = explode(':', $this->getPresenter()->getName());
Debugger::fireLog($this->getPresenter()->getName());
switch ($code) {
case 404:
$this->template->title = "Stránka nenalezena";
break;
default:
$this->template->title = $code;
break;
}
$this->setView(in_array($code, array(403, 404, 405, 410, 500)) ? $code : '4xx');
// log to access.log
Debugger::log("HTTP code $code: {$exception->getMessage()} in {$exception->getFile()}:{$exception->getLine()}", 'access');
} else {
Debugger::fireLog($this->getPresenter()->getName());
$this->setView('500'); // load template 500.latte
Debugger::log($exception, Debugger::ERROR); // and log exception
}
}
}
Vrací ‚Cannot load presenter 'Front:Error‘, class ‚App\FrontModule\ErrorPresenter‘ was not found in ‚…/app/FrontModule/presenters/ErrorPresenter.php‘.'
- H0w4rd
- Člen | 96
Řeším teď stejný problém, zkusil jsem vše, co tu bylo napsáno a nic nepomohlo. ErrorPresenter se vůbec nespouští a pořád se vrací default error stránka. Není něco v Nette 2.1.2 jinak? V error.log je jen záznam o té chybě, která se stala, ale nic o error presenteru.
Editoval H0w4rd (29. 4. 2014 12:52)
- Tomáš Jacík
- Člen | 147
Nette 2.2.3 a také jsem na to narazil. Když při vývoji nastane nějaká chyba, tak mi server hodí 502 Bad Gateway místo Tracy. Divné je, že to dělá jen při některých chybách. Při jiných ten presenter vpohodě najde.
- David Matějka
- Moderator | 6445
@gorgo
ale pak se za stránku ještě přidá default error page z Nette\Diagnostics.
asi behem provadeni error presenteru dojde k nejake chybe. Koukni se do log a tam to najdes
- Tomáš Jacík
- Člen | 147
@castamir Mam standardni ze sandboxu, bez extensions. Koukal jsem na nej a nevypada ze by v ne nejaka chyba mela byt.