Wyjątki Exception vs FormatException różnice

0

Witam.
Chciałbym się dowiedzieć jaka jest różnica, gdy w bloku catch użyję catch(Exception ex) zamiast np. catch(FormatException ex) w obu przypadkach wyrzuca mi
System.FormatException: 'Input string was not in a correct format.'.
Kiedy wyjątek jest nieobsługiwany(unhandled) oraz obsługiwany? Jaka jest różnica?

3

No lepiej jest łapać węższe wyjątki (FormatException), bo jak łapiesz szersze, to możesz niechcący złapać coś innego niepotrzebnie...

2

@elopadre: Klasy wyjątków dziedziczą po sobie. Jak weźmiesz wyjątek z samej góry hierarchii dziedziczenia a będziesz chciał złapać jeszcze inne wyjątki to pierwszy catch (Excption ) wyłapie wszystkie jednocześnie. W małych programach to nie ma znaczenia .

1
Zimny Krawiec napisał(a):

W małych programach to nie ma znaczenia .

Ale lepiej uczyć się i na małych programach porządku. :)

0

A co do rzucania wyjątkiem to dobrze rozumiem, że np. pisząc metodę w serwisie która przyjmuję jakiś model i wrzuca go do bazy danych sprawdzamy w niej np.
if(model == null){throw new NullReferenceException("Model object is null.")}
To potem wykorzystując tą metodę w kontrolerze musimy umieścić ją w bloku try a następnie gdy dany wyjątek zostanie wyrzucony w bloku catch(NullReferenceException nREx) robimy np. przekierowanie do widoku z opisem wyjątku.

0

Raczej ArgumentNullException. A najlepiej unikać rzecania wyjątkami. Dlaczego ten model może być nullem, z powodu aktywności usera? To walidacja powinna to załatwiać. A jak nie to możesz zwracać jakiś Result z metedy i na wyjściu przemapowac.

0
kzkzg napisał(a):

Raczej ArgumentNullException. A najlepiej unikać rzecania wyjątkami. Dlaczego ten model może być nullem, z powodu aktywności usera? To walidacja powinna to załatwiać. A jak nie to możesz zwracać jakiś Result z metedy i na wyjściu przemapowac.

Nie najlepiej -- bo to zależy od języka, ale i (co ważniejsze!) od modelu programowania i wytycznych. Wyjątki nie są po to,by ich unikać, tylko po to, by ich sensownie używać. Inaczej by ich nie było...

1
elopadre napisał(a):

A co do rzucania wyjątkiem to dobrze rozumiem, że np. pisząc metodę w serwisie która przyjmuję jakiś model i wrzuca go do bazy danych sprawdzamy w niej np.

if(model == null){throw new NullReferenceException("Model object is null.")}
To potem wykorzystując tą metodę w kontrolerze musimy umieścić ją w bloku try a następnie gdy dany wyjątek zostanie wyrzucony w bloku catch(NullReferenceException nREx) robimy np. przekierowanie do widoku z opisem wyjątku.

Moim zdaniem nie powinno sie wykorzystywac wyjatkow do sterowania jak to zrobiles.
Jezeli if'em sprawdzasz null to w bloku tego if'a powinienes w jakis sposob oprogramowac co w takim przypadku program ma robic.

Nawet nie jestem pewien czy objecie calego tego if'a jak go zrobiles blokiem try ma sens. Raczej zastapienie if'a blokiem try to dobry pomysl.

Generalnie wyjatki traktuj jako cos niespodziewanego co normalnie wg Ciebie nie powinno sie wydarzyc. Czytaj dokumentacje uzytych metod i jezeli ktoras moze rzucic wyjatek albo oprogramuj/zabezpiecz ten przypadek kodem kompleksowo, albo obejmij ten kod w bloku try i w kolejnych catch'ach obsluguj je tak aby miec pewnosc ze program utrzyma stabilnosc ale tez info co sie wydarzylo.

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