vyjimka pri redirectu?

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

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

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

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

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…

Jod
Člen | 701
+
0
-

No a čo spraví ona RedirectingException? Presmeruje na inú stránku a ukončí aplikáciu :) . Forwarding forwardne. Zdá sa mi to v poriadku.

wdolek
Člen | 331
+
0
-

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

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

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

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

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

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

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

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

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 ;)