Wyrzucanie wyjątków oraz ich obsługa

0

Ostatnio zastanawiałem się w jaki sposób poprawnie zajmować się wyjątkami.

W aktualnym projekcie w pracy jest takie podejście, że w miejscach w których mogłoby się coś wywalić np. odwołanie do cache albo jakieś akcje na bazie danych stosowane są bloki try catch z dodaniem logowania do bazy danych na temat błędu który zaszedł. Do tego przypisywana czasem jest jakaś wartość do pola typu bool czy operacja się powiodła czy nie, tak aby patrząc na nią w kontrolerze potem wyświetlić użytkownikowi odpowiedni komunikat. W innych przypadkach gdy nie potrzeba dużej ilości danych w zwrotce np. dla jakiegoś POSTa serwis posiadający taki sam blok zwraca boola, który jest wysyłany przez kontroler. Spotkałem się też z podejściem w którym w kontrolerze są sprawdzane wartości jakichś pól obiektu czy np. Id != 0 lub Id !=null i w zależności od tego wysyłamy użytkownikowi komunikat.

Nad tym wszystkim jest jeszcze redirect w webie który w momencie wyłapania 500 czy innego błędu przerzuca nas na domyślną stronę z informującą o wystąpieniu błędu.

Mam wrażenie, że nie jest to zrobione zgodnie ze sztuką.

Moglibyście podrzucić jakieś sensowne artykuły, albo rzucić komentarzem?

Dodam hipotetyczny problem:

Użytkownik chce dodać nowy produkt do faktury.
Wysyła formularz, po stronie serwera okazuje się że nie ma faktury o takim numerze.
Czy w takim wypadku należy lepiej wyrzucić wyjątek ArgumentNullException i jakoś w sensowny sposób to wyłapać przed kontrolerem i zwrócić false?
Czy może zrobić to samo bez wyjątku?
A może jest w ogóle lepsza droga?

4

Na pewno nie rzucać ArgumentNullException, skoro argument miał jakąś wartość inną niż null.
I nie rzucać też żadnego innego wyjątku, bo błędny numer faktury podany przez użytkownika to coś, co można łatwo przewidzieć, nic wyjątkowego. Z kodu biznesowego do kontrolera należy zwrócić obiekt ifnormujący o tym, że nastąpił błąd operacji dodawania produktu do faktury, zamiast obiektu świadczącego o powodzeniu operacji.
Następnie w kontrolerze (albo nawet actionfiltrze, jeśli chcemy mieć jakiś mechanizm spójny dla wielu kontrolerów), można to przerobić na odpowiednią informację dla użytkownika.

1 użytkowników online, w tym zalogowanych: 0, gości: 1