Vyhozené výjimky ve flash zprávičkách?

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

Jen rychlý dotaz, je korektní vyhozenou výjimku použít v zobrazené flash zprávičce?

Příklad: Mám user manager kde se provádí vytváření, editace atd. uživatele. Při editaci se provede kontrola na heslo, pokud je poskytnuté kolekci heslo k dispozici, provede se kontrola zda heslo odpovída uloženému, pokud ne tak to hodí výjimku s hláškou. Případně se provede kontrola zda nové heslo je ok a splňuje podmínky a taky v případě chyby se vyhodí výjimka InvalidStateException

Tyto výjimky odchytí try catch block ve formu v onSuccess metodě. Je tedy korektní tuto zprávu poslat ve formě flash message uživateli? Nebo by se to mělo vyhodnotit v catch a pak vytvořit flash zprávičku podle stavu?

duke
Člen | 650
+
0
-

Spíše bych to oddělil. V budoucnu můžeš chtít ty zprávičky např. překládat a mohou obsahovat parametry. Message ve výjimce by přitom měla sama o sobě být dostatečně popisná (obsahovat ty parametry už v sobě), a proto nevhodná jako klíč pro překlad.

Otázkou je, zda si ty parametrizované zprávy vytvářet až v těch catch blocích (pak by bylo asi nejpraktičtější si poslat potřebné parametry nějak už v té výjimce), a nebo nějakým jiným mechanismem (např. nějakým loggerem). Zřejmě by také šlo použít události (např. onInvalidLogin), do které by si presenter zaregistroval metodu, která by vytvořila odpovídající zprávičku dle dodaných parametrů.

akadlec
Člen | 1326
+
0
-

No já je nechci překládat v budoucnu ale už teď ;)
No ale jak to tedy řešit? Mít eventy jen čistě na zprávičky mi příjde jako kanon na vrabce. Spíš bych to vidělt tak že si udělat vlastní výjimky podle toho co se stane a podle toho je zpracovat v catchi co?

Tomáš Jablonický
Člen | 115
+
0
-

Zprávičky z Exception nepatří do FlashMessage :-). Udělej si nějakej helper, který bude na základě code z Exception překládat zprávičky nebo je přepiš ručně jak chceš. Ale kdyby jsi vrazil chybovou hlášku, například z DBALException do FlashMessage tak by to uživateli moc neřeklo.

Vlastní výjimky jsou dobrou cestou, ale pak se může stát že v těle Try budeš mít třeba 10 Catch (přeháním).

A ještě jedna věc. Nikdy nepoužívej Nette výjimky k vyhození Exception – vytvoř si vlastní strom výjimek (InvalidArgumentException, InvalidStateException, atd.). Nikdo totiž nemůže zaručit, že za měsíc ty vájimky v Nette ještě budou.

akadlec
Člen | 1326
+
0
-

No běžné výjimky chytám a zpracovávám jinak, ale tady v tomto případě mám vyhozené speciálni výjimky takže vím na beton co v ní bude, takže nějaká db výjimka by se samo uživateli nezobrazila. Tak mě právě napadlo tam kde na beton vim co může přijít to rovnou přehodit do flash, takto bych si musel poslat nějaký řetězec a ten pak ifovat/kejsovat ne?

Jan Tvrdík
Nette guru | 2595
+
0
-

@akadlec: Viz moje přednáška o výjimkách

akadlec
Člen | 1326
+
0
-

Takže tedy si vyhodím výjimku, dám ji nějaký kód a ten pak můžu odifovat či od kejsovat a podle toho si zpracuju hlášku, je tak ok?

Je nějaké pravidlo k vytváření kódů výjimek?

Jan Tvrdík
Nette guru | 2595
+
0
-

Ve většina případů je lepší kód výjimky vůbec nepoužívat. Třeba výjimky v C# nebo Javě kód normálně nepoužívají. Zpracování se dělá podle typu výjimky. Viz zase ta přednáška.

akadlec
Člen | 1326
+
0
-

No já přednášku jen proklikal bez zvuku ;) takže když mám v manageru třeba 5 stavů co chci zachytit tak tedy 5 typů výjimek?

mkoubik
Člen | 728
+
0
-

Pokud ty výjimky vyžadují odlišné zpracování, tak by měly mít odlišný typ. Pokud je zpracováváš stejně, akorát se liší flash message kterou vypíšeš uživateli, tak bych možná použil nějaký result objekt, který bych předal té výjimce.