ErrorPresenter nefunguje v produkčním režimu

Odo
Člen | 48
+
0
-

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.

David Matějka
Moderator | 6445
+
0
-

a jak mas v configu nastaveny error presenter?

Odo
Člen | 48
+
0
-
application:
	errorPresenter: Error
	catchExceptions: true
	mapping:
		Error: App\*Presenter
		*: App\*Module\*Presenter

Jak jsem psal, v ladícím režimu to funguje…

iguana007
Člen | 970
+
0
-

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)

David Grudl
Nette Core | 8082
+
0
-

Zkus smazat cache.

Odo
Člen | 48
+
0
-

David Grudl napsal(a):

Zkus smazat cache.

Sakra, to mě mělo napadnout… Děkuju, už to funguje!

Odo
Člen | 48
+
0
-

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

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)

David Matějka
Moderator | 6445
+
0
-

a je neco v logu?

Odo
Člen | 48
+
+1
-

V tom druhém případě je v produkčním režimu v logu výjimka správně zapsaná (403 nebo 404). Ale zobrazí se interní chybová stránka Nette.

Odo
Člen | 48
+
+1
-

Takže takhle. Má-li se automaticky v produkčním módu volat ErrorPresenter a v debug módu Laděnka, nesmí být v souboru config.neon nastaveno catchExceptions. Asi mám dlouhé vedení, neboť v dokumentaci je to napsáno poměrně srozumitelně…

d@rkWolf
Člen | 162
+
+1
-

@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 Error4×x 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.

David Grudl
Nette Core | 8082
+
+3
-

potvrzuju, že je tam chyba, docku jsem opravil

MilanT
Člen | 4
+
0
-

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

@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 | 8082
+
+1
-

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

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

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

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 | 8082
+
+3
-

Protože chyba je v tom errorPresenteru (nebo jeho šabloně) a ten se při catchException: false nepouští.

MilanT
Člen | 4
+
+2
-

Děkuji za pomoc, už jsem to pochopil a funguje to, přeji pěkný den.

Editoval MilanT (19. 6. 2020 12:45)