Jak řešíte chybu vzniknuvší při renderovní stránky?

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

Vzhledem k tomu, že se celkem rozmohlo používání např. dibi fluent, které db dotazy kladou lazy způsobem až při vykreslování, tak by mě zajímalo, jak řešíte, když v takovém dotazu dojde k chybě. Případně to může být jakákoliv jiná chyba, která vznikne, když už je část stránky odeslána uživateli.

O lazy dotazy bych se nerad připravil, protože velmi usnadňují cachování (prostě v šabloně obalím blok makrem cache a neklade se ani dotaz) a také způsobují zrychlení načítání stránky (stránka se odesílá průběžně a uživatel nemusí čekat, než se mi doběhne složitý dotaz v patičce, abych mu vůbec začal posílat hlavičku).

Takže jako řešení mě napadá:

  • defaultní chování: vygeneruje se error presenter, což znamená, že se do těla stránky znovu vkládá hlavička, atd… – zcela nevalidní html (neuzavřený DOM), rozbitý vzhled, atd… – nic moc
  • oželet lazy DB dotazy a výstup třeba bufferovat, aby se zamezilo chybám, když už je odeslaný výstup – to se mi moc nechce
  • při chybě vypsat nějaký Javascript, kterým se pokusíte skrýt skrýt aktuální obsah a nahradit chybovou stránkou – to není tak triviální, protože je to zatím neuzavřený DOM, težko bude script odstraňovat sám sebe a do <body> už prohlížeč další <html> nevykreslí, takže to sice jde, ale ne ideálně. Navíc to nezafunguje s vyplým Javascriptem.
  • při chybě prostě vypsat akorát text, že se to nepovedlo a ukončit – může se renderovat třeba skrytý prvek, nebo nějaký mimo obrazovku, strašně úzký, atd…
  • při chybě Javascriptem přesměrovat na stránku která oznámí chybu – závisí na Javascriptu, ale hlavně uživatel uvidí v adresním řádky jinou url a nemůže zkontrolovat jestli něco není špatně v adrese. Navíc přijde třeba o odeslaný formulář, když by mohlo stačit udělat refresh.

Takže žádný způsob co mě napadl mi nepřipadá zrovna dvakrát vhodný, tak by mě zajímalo, jak to řešíte vy. Díky.

Edit: Přidán poslední způsob.

Editoval nAS (18. 12. 2010 15:19)

arron
Člen | 464
+
0
-

Takhle z patra me napada pouzivat nejakou mezitridu mezi aplikaci a databazi (coz tak jako tak neni uplne spatne, terba kdyz se rozhodnes pouzivat nejaky jiny db engine), vzniklou chybu odchytit (a zalogovat) a vratit prazdy vysledek dotazu (pokud je to jenom trochu mozne). Popripade prevest vyhozeni vyjimky na vraceni chybove hodnoty a podle te se pak v sablone zaridit.

Filip Procházka
Moderator | 4668
+
0
-
  1. v šabloně ti nesmí vzniknout chyba
  2. povolená chyba v šabloně je pouze „chybový stav“ a né chyba sama o sobě, čili takový chovybový stav je třeba že nemáš žádné články, tak vypíšeš že nemáš žádné články

Do Kdyby plánuju dát něco jako automatický zámek, tzn že když na stránce vznikne chyba scriptu, tak se zamkne, jenom ta na které ta chyba vznikla. S tím že poprvé se vykreslí třeba neúplná a ukončí se renderování, uživatel si bude myslet že se něco posralo ve spojení, aktualizuje stránku a tam už bude hláška o údržbě chyby. Chce to ještě trochu domyslet co a jak zamykat.

Ale základní předpoklad, je že ve stránce chyby nejsou.

Editoval HosipLan (18. 12. 2010 11:45)

Foowie
Člen | 269
+
0
-

Pomocí JS by šlo změnit adresu na error presenter …

Aurielle
Člen | 1281
+
0
-

ErrorPresenter není běžným HTTP požadavkem dosáhnutelný.

Foowie
Člen | 269
+
0
-

Dobře, tak na jiný presenter, který oznámí uživateli chybu.

Filip Procházka
Moderator | 4668
+
0
-

ale je, jenom mu musíš nějak předat tu vyjímku co vznikla, nebo si napsat vlastní error presenter, kterému stačí http kód

nAS
Člen | 277
+
0
-

arron napsal(a):

Takhle z patra me napada pouzivat nejakou mezitridu mezi aplikaci a databazi (coz tak jako tak neni uplne spatne, terba kdyz se rozhodnes pouzivat nejaky jiny db engine), vzniklou chybu odchytit (a zalogovat) a vratit prazdy vysledek dotazu (pokud je to jenom trochu mozne). Popripade prevest vyhozeni vyjimky na vraceni chybove hodnoty a podle te se pak v sablone zaridit.

To je určitě možnost, ale v praxi často závisí jednotlivé části stránky na sobě. Takže když se nepodaří vyselectit jedna část, tak to sebou shodí i všechny závisející části, takže výsledek také není moc uspokojivý. A co dělat s chybovým kódem bys musel řešit u každého selectu zvlášť a to by moc pohodlné nebylo.

HosipLan napsal(a):

Do Kdyby plánuju dát něco jako automatický zámek, tzn že když na stránce vznikne chyba scriptu, tak se zamkne, jenom ta na které ta chyba vznikla. S tím že poprvé se vykreslí třeba neúplná a ukončí se renderování, uživatel si bude myslet že se něco posralo ve spojení, aktualizuje stránku a tam už bude hláška o údržbě chyby. Chce to ještě trochu domyslet co a jak zamykat.

To je zajímavé, ale ještě by to chtělo kontrolovat, zda se chyba opakuje, protože může nastat jednou a pak zase stránka může fungovat normálně. A ještě je potřeba rozmyslet co přesně zamknout. Celý preseneter? View? View s přesnými parametry? I podle COOKIES?

Ale základní předpoklad, je že ve stránce chyby nejsou.

To se snadno řekne, ale když ti někdo vykopne síťový kabel z DB serveru tak se to špatně zajišťuje ;)

Foowie napsal(a):

Pomocí JS by šlo změnit adresu na error presenter …

To jsem zapomněl napsat, přidal jsem to do prvního příspěvku.

PS: Nechci aby to vypadalo, že jenom kritizuju, vím že dokonale to řešit nejde, a jsem rád že píšete různé nápady.

Aurielle
Člen | 1281
+
0
-

HospiLan: bude potřeba vlastní ErrorPresenter, který se ale bude chovat jako normální presenter… a to kvůli tomuhle

voda
Člen | 561
+
0
-

Já jsem to vyřešil tak, že jsem přepsal makro widget a obalil ho pomocí try-catch. Nemusí to fungovat vždy, ale třeba u datagridu to funguje dobře.

Patrik Votoček
Člen | 2221
+
0
-

základním předpokladem by mělo být nikdy nikomu a ničemu nevěř. Takže by jsi se mě podle toho ve vykreslované šabloně řídit. Nicméně tohle je téma které mě poslední dobou doopravdy hodně trápí protože máme v celou aplikaci vpodstatě postavenou na komponentách (aby jsme dosáhly dynamyčnosti které s presentery dosáhnout nejde). A když dojte při vykreslování 20té komponenty na stránce která je navíc na 3tí urovni zanoření k chybě hezky to nevypadá.

Jediné řešení které mě napadlo je bufferovat celý výstup a v případě chyby ho zahodit ale tím se celkem výrazně zpomalí celá aplikace.

Nemáte někdo okoukané jak to řešejí třeba v Symfony/Zendu?

srigi
Nette Blogger | 558
+
0
-

vrtak-cz napsal(a):

Nemáte někdo okoukané jak to řešejí třeba v Symfony/Zendu?

V Zende to chytaju do buffra.

Jod
Člen | 701
+
0
-

Najlepšie mi príde do komponenty dať try catch a vypísať, že v komponente sa vyskytla chyba. Resp. to čo písal voda.

dEath
Člen | 39
+
0
-

Řeším to podobně … zachytím si chybu v Komponentě|Presenteru pomocí try-catch a podle důležitosti komponenty buď shodím aplikaci 505kou nebo nevypíši nic (myšleno pro výpis dané komponenty)

Editoval dEath (22. 12. 2010 6:16)