czwartek, 17 września 2015

Podstawy wyjatków w csharp [c#]

Krótko o podstawach wyjątków (exceptions) w c#

W samym .NETcie istnieje bardzo dużo zdefiniowancyh już wyjątków, które możemy użyć w naszej aplikacji. Dziś skupimy się wyłącznie na podstawowych informacjach. Każdy wyjątek dziedziczy po klasie Exception. Jest to klasa nadrzędna dla exceptionów. Schodząc niżej o jeden poziom następuje podział na: ApplicationException oraz SystemException.

SystemException - po tej klasie dziedziczą wszystkie systemowe (dotnetowe) wyjątki takie jak nasz "ulubiony" NullPointerException. Można w skrócie powiedzieć, iż są to wyjątki dla niskopoziomowych części systemu.

ApplicationException - dziedziczą po niej wyjątki rzucane w wysokopoziomowych częściach aplikacji. Jeśli piszemy jakąś aplikację to dobrze jest aby nasze customowe wyjątki właśnie po niej dziedziczyły. Np. przypuścmy wystąpiła w naszej aplikacji jakaś sytuacja wyjątkowa, wtedy rzucamy naszym własnym wyjątkiem np. CustomException, dziedziczącym po ApplicationException.

Cała moc exeptionów właśnie w hierarchii w ich łapaniu. Dawno temu kiedy jeszcze nie było wyjątków reagowanie na wyjątkowe sytuacje odbywało się przez zwracanie odpowiedniego kodu błędu. Można było się w tym pogubić.

Zobaczmy prosty przykład użycia:
class NameException : ApplicationException {}

//----
// jakieś linie kodu
// i dochodzi do sytuacji wyjątkowej
//----


try{

  if (string.IsNullOrEmpty(name)) {
   throw new NameException();
  }
}catch(NameException ex) {
 // tutaj przejdzie sterowanie
}
catch(ApplicationException ex){ 
 // tutaj nie przejdzie
}
catch(Exception ex) {
 // tutaj tez nie przejdzie
}

Jeślibyśmy rzucili zamiast NameException jakimś innym dziedziczącym po ApplicationException to by wpadło do drugiego catcha. Natomiast wyrzucony wyjątek dziedziczyłby zaraz po klasie Exception to by wpadł do 3 catcha.
Dlatego bardzo ważna jest hieriarchia aby odpowiednio móc przechwytywać i reagować na wyjątki.

Brak komentarzy: