vyjimka pri redirectu?
- wdolek
- Člen | 331
ustavicne dostavam vyjimku pri redirectu i forwardu… zprava vyjimky je URL, kam se chci presmerovat – URL existuje a je v poradku…
zprava:
http://localhost:8080/?…
trace:
#0 \devel\libs\Nette\Application\PresenterComponent.php(335): Presenter->redirectUri('...', 303)
#1 \devel\app\presenters\LoginPresenter.php(75): PresenterComponent->redirect('Student:')
#2 [internal function]: LoginPresenter->studentLoginSubmitted(Object(AppForm))
#3 \devel\libs\Nette\ObjectMixin.php(84): call_user_func_array(Array, Array)
#4 \devel\libs\Nette\Object.php(106): ObjectMixin::call(Object(AppForm), 'onSubmit', Array)
#5 [internal function]: Object->__call('onSubmit', Array)
#6 \devel\libs\Nette\Forms\Form.php(416): AppForm->onSubmit(Object(AppForm))
#7 \devel\libs\Nette\Application\AppForm.php(119): Form->submit()
#8 \devel\libs\Nette\Application\Presenter.php(333): AppForm->signalReceived('submit')
#9 \devel\libs\Nette\Application\Presenter.php(203): Presenter->processSignal()
#10 \devel\libs\Nette\Application\Application.php(155): Presenter->run()
#11 \devel\app\bootstrap.php(53): Application->run()
#12 \devel\index.php(18): require('...')
#13 {main}
v Student.php (modelova trida) nemam zadny vypis, nic… zadny skript neukoncuji PHPckovym uzaviratkem, takze ani tak by se do vystupu nemelo nic dostat.
nejak si s tim nevim rady :(
nema nekdo potuchy, co vse by mohlo stat za vyjimkovanim?
Editoval wdolek (16. 7. 2009 13:47)
- wdolek
- Člen | 331
aha, tak se ukazuje, ze redirect i forward snad hazi vyjimku pokazde :D – mel sem totiz
try {
...
$this->forward('Student:');
} catch(FooBarException $e) {
...
} catch(Exception $e) {
...
}
a ono to proste probublalo az do te posledin vyjimky… :P opravdu pozoruhodne chovani :(
- jasir
- Člen | 746
wdolek napsal(a):
aha, tak se ukazuje, ze redirect i forward snad hazi vyjimku pokazde :D – mel sem totiz
try { ... $this->forward('Student:'); } catch(FooBarException $e) { ... } catch(Exception $e) { ... }
a ono to proste probublalo az do te posledin vyjimky… :P opravdu pozoruhodne chovani :(
Při redirectu i forwardu Nette vyhodí výjimku
ForwardingException
resp. RedirectingException
.
Ty je všechny zachytíš pomocí catch(Exception $e)
. Musíš
chytat výjímky trošku více selektivně, ne takto všechny.
- wdolek
- Člen | 331
jasir napsal(a):
Při redirectu i forwardu Nette vyhodí výjimku
ForwardingException
resp.RedirectingException
.
Ty je všechny zachytíš pomocícatch(Exception $e)
. Musíš chytat výjímky trošku více selektivně, ne takto všechny.
vsiml jsem si, ze v dokumentaci obcas chybi odokumentovane „@throws
Neco“ – zejmena pak treba dibi – funkce A, ktera pouziva funkci B, ktera
vyhazuje vyjimku, uz nema odokumentovano, ze vyhazuje vyjimku (a zaroven
neosetruje pomoci try-catch) – mam pocit, ze to bylo neco kolem fetch( ), ted
si ale nejsem jisty.
kvuli podobnym pripadum tedy jednak definuji na jake vyjimky ma aplikace
reagovat, a pro sichr pak odchytavam vyjimky genericky.
ostatne – neslouzi vyjimky k ukoncovani aplikace / hlaseni chyb… a ne ke konstrukci nejake featury? chapu, ze PHPcko je znacne mrzke, ale to neni nejaky jiny zpusob? (pomoci nejakeho callbacku?). kdyz jsem koukal do zdrojaku na funkce forward a redirect, bylo mi z toho smutno – nechapal sem totiz, jak se vyhnout vetvi, ktera vyhazuje vyjimku…
- wdolek
- Člen | 331
Jod napsal(a):
No a čo spraví ona RedirectingException? Presmeruje na inú stránku a ukončí aplikáciu :) . Forwarding forwardne. Zdá sa mi to v poriadku.
co udela… ale „JAK“ to udela :) … jiste, muzu michat polevku sroubovakem, misto vypinacu mohu sepinat obnazene draty, muzu si na auto namontovat hranata kola… vyjimky byly snad vzdy neco „vyjimecneho“ co indikovalo chybovy stav aplikace, ne?
- jasir
- Člen | 746
wdolek napsal(a):
Jod napsal(a):
No a čo spraví ona RedirectingException? Presmeruje na inú stránku a ukončí aplikáciu :) . Forwarding forwardne. Zdá sa mi to v poriadku.
co udela… ale „JAK“ to udela :) … jiste, muzu michat polevku sroubovakem, misto vypinacu mohu sepinat obnazene draty, muzu si na auto namontovat hranata kola… vyjimky byly snad vzdy neco „vyjimecneho“ co indikovalo chybovy stav aplikace, ne?
Já myslím, že je to naprosto v pořádku. Výjímka nemusí být nutně chyba, nevím proč si to myslíš (to by se to jmenovalo Error). Zde znamená „redirect a abort“, případně „forward a abort“. Je to naopak velice pěkně navržené, naopak zachytávat všechny vyjímky (i cizí) je zvláštní, měl bys zachytávat jen ty, které potřebuješ obsloužit.
Editoval jasir (16. 7. 2009 18:01)
- wdolek
- Člen | 331
jasir napsal(a):
Já myslím, že je to naprosto v pořádku. Výjímka nemusí být nutně chyba, nevím proč si to myslíš (to by se to jmenovalo Error). Zde znamená „redirect a abort“, případně „forward a abort“. Je to naopak velice pěkně navržené, naopak zachytávat všechny vyjímky (i cizí) je zvláštní, měl bys zachytávat jen ty, které potřebuješ obsloužit.
z programovani v Jave a .NETu mam zazite, ze exception = chyba / vyjimecny stav aplikace (pricemz pozadavek na presmerovani za vyjmecny skutecne nepovazuji)… a ze mam odchytavat jen to co me zajima – v presenteru bych snad ale mel odchytit vse, aby aplikace nespadla a v pripade nejake te chyby (vyvolane vyjimky) abych sam v presenteru neco uzivateli ukazal – a jemu se nezobrazila nejaka hlaska popripade jen „error 500“. aplikace by mela byt precejen trosku blbuvzdorna.
- Ondřej Mirtes
- Člen | 1536
Exception je něco, z čeho se aplikace může vzpamatovat. A to, že
redirect/forward hází Exception je hodně praktické – máš tak vyřešenu
např. obdobnou situaci, kdy toto člověk bez frameworku řeší pomocí
volání funkce header('Location: ...')
– při něm se totiž
aplikace neukončuje a tak je potřeba za každé volání header()
přidat ještě exit()
.
- David Grudl
- Nette Core | 8228
Je pravda, že mezi programátorské poučky patří, že výjimky by se neměli používat pro nahrazování skoků v rámci aplikace, jako jakési goto. Jenže přesměrování je prostě výjimka v běhu presenteru – obvykle ji neumí nijak vyřešit, tak to nechá na nadřazené vrstvě – application – a ta ji zpracuje. Myslím že je to z hlediska architektury čisté. Pak je tu hledisko praktické, kde mi tento způsob připadá ideální.
- wdolek
- Člen | 331
a co je spatne na tom, aby byla funkce implementovana bez vyhozeni vyjimky – nastaveni hlavicky (location…) a ukonceni skriptu (exit( )) ?
a myslim, ze by toto chovani (a asi nejen pro mne zvlastni) melo byt nejak vyrazne zmineno v dokumentaci. zatim sem to tam nenasel – a popravde ani poradne nevim, kam bych to doplnil. + doplnit do zdrojaku „always throws …Exception“ – alespon me by to usetrilo 2h dumanim co je spatne :)
- romansklenar
- Člen | 655
LastHunter napsal(a):
Exception je něco, z čeho se aplikace může vzpamatovat. A to, že redirect/forward hází Exception je hodně praktické – máš tak vyřešenu např. obdobnou situaci, kdy toto člověk bez frameworku řeší pomocí volání funkce
header('Location: ...')
– při něm se totiž aplikace neukončuje a tak je potřeba za každé voláníheader()
přidat ještěexit()
.
Taky se na to dívám kladně. Navíc je tam díky tomu i praktická
možnost zareagovat na určitou výjimku v ErrorPresenteru
po svém.
- kravčo
- Člen | 721
wdolek napsal(a):
… a pro sichr pak odchytavam vyjimky genericky.
A práve kvôli tomuto si na to, prečo ti to nefunguje, neprišiel sám…
V Nette je na odchytávanie neštandardných výnimiek určená Ladenka, ktorá to robí za nás a veľmi dobre. Skús si o nej niečo prečítať v dokumentácii…
- marek.dusek
- Člen | 99
dokumentaci jsem cetl, „pohodli“ stavajici implementace chapu, ale principielne to imho korektni neni – naopak souhlasim s tim, ze vyjimka = neco „spatneho“, co je treba resit (nemluve o performance hitu, ale v tomto pripade je to irelevantni).
(prinejmensim to neni standardni a hadam nejsem jediny, komu v try-catch bloku v kdovi cem skoncila forward exception ;)