ErrorPresenter nefunguje v produkčním režimu
- Odo
- Člen | 48
Zdravím,
v ladícím režimu mi ErrorPresenter funguje perfektně, ale
v produkčním režimu (tj. když na web přistupuju z jiné IP, než mám v
setDebugMode
v bootstrap.php) naskočí vždy jen standardní
šablona Laděnky 500 Server Error.
Např. když testuju neexistující cestu, v logu je správné nahlášená chyba 404:
[2018-09-24 15-32-31] Nette\Application\BadRequestException: No route for HTTP request. #404 in /home/www/***/vendor/nette/application/src/Application/Application.php:116 @ http://***/x @@ exception--2018-09-24--14-55--8b56d12006.html
ale zobrazí se Tracy 500 (v ladícím režimu se normálně spustí ErrorPresenter).
Nefunguje to ani když zredukuju ErrorPresenter na minimum:
<?php
namespace App;
class ErrorPresenter implements Application\IPresenter
{
/**
* @return Application\IResponse
*/
public function run(Application\Request $request)
{
echo "error"; // tohle by snad fungovat mělo...?
}
}
Vážně nevím, kde dělám chybu. Používám Nette 2.4–20180703.
- iguana007
- Člen | 970
Pastnul si zde celý kód toho ErrorPresenteru? Protože pokud ano, tak by to imho mělo být:
class ErrorPresenter implements Nette\Application\IPresenter {}
A v configu nemám to catchExceptions: true, jinak to mám cca stejné jako ty a funguje mi to
Editoval iguana007 (24. 9. 2018 20:20)
- Odo
- Člen | 48
iguana007 napsal(a):
Pastnul si zde celý kód toho ErrorPresenteru? Protože pokud ano, tak by to imho mělo být:
class ErrorPresenter implements Nette\Application\IPresenter {}
A v configu nemám to catchExceptions: true, jinak to mám cca stejné jako ty a funguje mi to
Mám tam
use \Nette\Application;
a ten kód je skoro stejný jako v sandboxu. Pomohlo smazání cache :)
- Odo
- Člen | 48
Tak dneska jsem zjistil, že to zase nefunguje tak, jak jsem myslel. Jde mi o chování při BadRequestException a ForbiddenRequestException.
Když mám v config.neon
application:
catchExceptions: true
tak v ladícím i produkčním módu se zavolá ErrorPresenter (nevidím Laděnku).
Když mám v config.neon
application:
catchExceptions: false
tak v ladícím módu vidím Laděnku a produkčním módu vždy jen chybu 500 (ErrorPresenter se nevolá).
Smazání cache na to nemá vliv.
Co dělám špatně?
Editoval Odo (19. 12. 2018 13:25)
- d@rkWolf
- Člen | 167
@Odo Nemáš dlouhé vedení…přesně to samé řeším posledních několik hodin-kupodivu jsem pročetl asi 50 fór a zrovna tohle mi uniklo…taky sem měl v config.neon(resp. používám nový nette3, kde je common.neon) ten parametr vložený, protože sem měl za to, že když je nastavený na „výchozí“ hodnotu dle dokumentace, je to v pořádku.
@DavidGrudl Zdravím, bylo by prosím možné přidat do dokumentace nějaké hodně výrazné upozornění, že na produkci NESMÍ být v common.neon nastaveno catchExceptions, ani jako false.
Momentálně je tam toto:
# má efekt pouze ve vývojářském režimu
catchExceptions: … # (bool) výchozí je false
To není pravda, pokud se tento záznam, byť jako catchExceptions: false nechá v configu, způsobí to neustálé vyhazování 500 na všechno. Ve chvíli, kdy jsem dle Oda ten záznam vymazal a smazal cache, vypadla na mě 404. Buď je někde bug a ten parametr se netestuje na bool, ale na existenci, nebo je to špatně popsané. Nedokážu odhadnout, kde je problém, tak hluboko do toho nevidím a popravdě, teď sem na to tak vzteklý…
Abych popsal, jak přesně to mám-měl sem nastaveno v common.neon catchExceptions: false a v local.neon na localhostu catchExceptions: true. Za této situace na localhostu v debug módu vše funguje jak má, můžu si otestovat a upravit Error4xx presenter a jeho šablony, všecko OK, potom to vezmu, pošlu to na produkční test, common nechávám jak je-verzuje se, neupravuje se. Vytvářím si produkční-testovací local.neon (bez catchExceptions), výsledek, furt 500, na všecko 500, no route, no presenter, všecko 500. Smažu catchExceptions: false z common.neon, dumpnu cache, na domena/dfsdafjl konečně dostanu 404 místo 500.
- MilanT
- Člen | 4
Ahoj, mám teď stejný problém, ale vůbec nevím jak ho vyřešit, protože nic z toho co zde bylo mi nepomohlo, ve zkratce, vyzkoušel jsem vše co zde bylo zmíněné (configy) a nic mi nepomohlo ani když jsem pokaždé mazal cache. Když jsem normálně v debug módu, a napíšu třeba domena.cz/dasdagvad tak mi to hodí 404, tak jak má, ale když jsem v produkčním módu 500 error.
Zkoušel jsem měnit vše podle odpovědí v tomto topicu, ale nic mi nepomohlo a nevím jestli je problém mezi židlí a klávesnicí, nebo kde.
Původně jsem tam měl:
application:
errorPresenter: Error
catchExceptions: true
mapping:
Error: App\Presenters\*Presenter
*: App\Presenters\*Presenter
a potom jsem zkoušel vše co mě napadlo, ale nic mi nefungovalo.
Jinak co se týče toho catchExceptions: true
tak to mi
způsobovalo problémy i v debug módu (ignorovalo to $this->error() jako
kdyby error nebyl) a v produkčním to pokračovalo jako kdyby se žádný
error nestal, jenom tam nebyly incializované proměnné, když to je na false,
tak to funguje a v debugu je 404 ale v produkčním to hází error 500.
- Pavel Kravčík
- Člen | 1196
@MilanT: Nedávno se ozval na mail jeden uživatel a řešil jsem s ním stejný problém přes videohovor – byla to kombinace více chyb, které se za sebe skrývaly. Ale hlavní problém byl ve velkých malých písmenech na různých místech (názvy souborů, namespace, configy). Podíval se hlavně na to.
- David Grudl
- Nette Core | 8239
Je nesmysl zkoušet nazdařbůh cokoliv měnit, protože informaci o tom, co
je špatně, máš v logu. A pokud není v logu, tak je potřeba zjistit,
proč není v logu. Což se dá zjistit třeba tak, že přepnu do vývojového
režimu a zkusím něco zalogovat
pomocí Tracy\Debugger::log('xxx');
- MilanT
- Člen | 4
Ano, zapomněl jsem se podívat do logu, chybu vidím, ale furt to nechápu.
Mám tam chybu
Cannot include undefined block 'description'.
, ale to je tím že
mi nějak nefunguje $this->error()
v produkčním režimu anebo
tu funkci používám jinak, jak má být používána.
Mám podmínku která určí zda daná stránka existuje, pokud ne, zavolá
se $this->error()
a pokud ano, údaje z databáze se zapíšou
do šablony, tohle mi funguje v produkčním režimu, ale pouze pokud je
catchExceptions nastaveno na false, když dám true, objeví se stejná chyba
jako v logu, jenom se mi vypíše rovnou.
- David Grudl
- Nette Core | 8239
To je zjevně chyba v šablonách, která vůbec nesouvisí s $this->error(). Musí se nepochybně projevovat i ve vývojářském režimu.
- MilanT
- Člen | 4
Právě že neprojevuje, aspoň ne tedy jak by měla, pokud je chyba v šabloně. Moje podmínka vypadá takto:
$pageObj = $this->pageManager->getPage($page);
if($pageObj) {
$this->template->page = $pageObj;
} else {
$this->error('Tato stránka neexistuje');
}
a pokud v konfiguračním souboru mám nastaveno
catchExceptions: false
, v tracy dostanu
Nette\Application\BadRequestException #404
Tato stránka neexistuje
ale v případě, že nastavím catchExceptions: true
, dostanu
stejnou chybovou hlášku která se týká šablony, jak již jsem psal. Je
možné že mám někde chybu v tom PageManageru, vyzkouším to, ale stejně
nevím jak by to mělo souviset s hodnotou v configu.
- David Grudl
- Nette Core | 8239
Protože chyba je v tom errorPresenteru (nebo jeho šabloně) a ten se při
catchException: false
nepouští.