Poznasz teraz co to są wyjątki w C#.NET, na samym początku postarajmy sobie wytłumaczyć co to jest wyjątek, w C#.NET wyjątkiem jest na przykład błąd przekroczenia indeksu, wyjątkiem (błędem) jest też przypisanie do zmiennej int zmiennej typu char. Wychwycenie tych wyjątków w programie pozwala nam uchronić program przed ewentualnymi błędami, zacznijmy może od ogólnej deklaracji takiego wychwytywania wyjątku:
try
{
…
}
catch(nazwa_wyjątku1)
{
…
}
catch(nazwa_wyjątku2)
{
…
}
finalny
{
…
}
O.K teraz pora na małe wyjaśnienia co jest co. W bloku kodu try umieszczamy kod w którym może wystąpić jakiś wyjątek (jakiegoś typu, na przykład przepełnienie indeksu), lub kod który ma zostać poddany kontroli. W blokach catch wypisujemy co ma być wykonane po wychwyceniu jakiegoś wyjątku, w nawiasach piszemy jaki wyjątek ma być wychwycony. Instrukcja finally jest opcjonalna oznacza to może jej nie być, wykonuje się ona zawsze na końcu nie zależnie od tego czy wystąpił wyjątek czy nie, można jej użyć np. do zamykania strumienia, bądź połączenia do bazy danych. A więc przejdźmy, może do jakiegoś prostego przykładu w którym to spowodujemy przepełnienie indeksu:
Początek kodu:
using System;
class Pokaz
{
public static void Main()
{
int[] tablica = new int[10];
try
{
for (int i = 0; ; i++)
{
tablica[i] = i;
Console.WriteLine(i);
}
}
catch(IndexOutOfRangeException)
{
Console.WriteLine(„Nastąpiło właśnie przepełnienie indeksu”);
}
}
}
Koniec kodu:
Ok. prześledźmy sobie teraz nasz kod, widać że deklarujemy w nim tablicę której rozmiar równy 10, tworzymy pętle która to ma specjalnie przekroczyć ten indeks od razu widać, że też tak się stanie. Ale kod ten umieszczamy w bloku try, następnie w catch piszemy jaki rodzaj wyjątku chcemy wychwycić czyli przepełnienie indeksu. Widać, że zrezygnowaliśmy tutaj z finally jak wspominałem jest ono opcjonalne i jego działanie możesz sobie sam prześledzić. Teraz pokażę ci jak na przykład wyświetlić wiadomość błędu, to znaczy IndexOutOfRangeException przypiszemy coś w rodzaju nazwy ‘e’ i wyświetlimy odpowiedni string.
Początek kodu:
using System;
class Pokaz
{
public static void Main()
{
int[] tablica = new int[10];
try
{
for (int i = 0; ; i++)
{
tablica[i] = i;
Console.WriteLine(i);
}
}
catch(IndexOutOfRangeException e)
{
Console.WriteLine(„Nastąpiło właśnie przepełnienie indeksu\n\nTreść błędu:\n”);
Console.WriteLine(e.ToString());
}
}
}
Koniec kodu:
O.K mniej więcej teraz już wiesz jak działa ten mechanizm wychwytywanie wyjątków. Istnieje coś takiego jak instrukcja catch która to wyłapuje wszystkie wyjątki, zapisujemy ją bez nawiasów ( ) po prostu samo:
catch
{
…
}
Pamiętaj też o tym, że pod jednym try, może być kilka catch i kilka różnych wyjątków do wychwycenia. Poniżej znajduje się lista kilku z najczęstszych wyjątków, spróbuj kilka z nich wywołać i wyłapać:
ArraryTypeMismatchException – Typ wartości jaki chcemy przypisać jest niezgodny z typem docelowym
DivideByZeroException – Próba dzielenia przez zero
IndexOutOfRangeException – Przekroczenie indeksu
InvalidCastException – Niepoprawne rzutowanie w czasie rzeczywistym
OutOfMemoryException – Porażka wywołania new z powodu braku wolnej pamięci
OverflowException – Arytmetyczne przepełnienie
Jest jeszcze kilka zagadnień związanych z wyjątkami które są warte omówienia, jedną z takich rzeczy jest możliwość zgłaszania wyjątków poprzez użycie słowa kluczowego throw. Tak wygląda ogólna deklaracja takiego zgłoszenia wyjątku:
throw new nazwa_wyjątku();
Gdzie nazwa wyjątku jest jedną z nazw wyjątku, np. DivideByZeroException czyli wyjątek zgłaszany podczas próby dzielenia przez zero. Ok. to spróbujmy zgłosić jakiś wyjątek, na przykład przekroczenia indeksu, poprawmy zatem jeden z naszych poprzednich programów który to był poświęcony indekserom. A oto kod:
Początek kodu:
using System;
class liczby
{
int[] tab;
public liczby(int rozmiar)
{
tab = new int[rozmiar];
}
public int this[int index]
{
get
{
return tab[index];
}
set
{
if (value % 3 == 0)
{
if (index <= tab.Length – 1)
tab[index] = value;
else
throw new IndexOutOfRangeException(); // Zgłaszamy wyjątek ;
}
}
}
public void Wyswietl_elementy()
{
foreach (int x in tab)
{
Console.WriteLine(x);
}
}
}
class Pokaz
{
public static void Main()
{
liczby a = new liczby(10);
a[0] = 9;
a[1] = 34;
a[2] = 3;
a[3] = 7;
a[4] = 4356;
a[19] = 15;
a.Wyswietl_elementy();
}
}
Koniec kodu:
Jak widzisz podczas przekroczenia indeksu zostanie zgłoszony wyjątek przez nasz kod. Pozostaje nam tylko jeszcze dodać try i wychwycić wyjątek.
Ostatnią rzeczą jaką omówimy jest przerzucanie wyjątków, co to oznacza? Po wychwyceniu jakiegoś wyjątku w catch możemy go za pomocą throw przerzucić dalej. Prześledź sobie najpierw kod bez przerzucania wyjątku z zaraz go sobie prześledzisz z przerzucaniem.
Początek kodu:
using System;
class Klasa_A
{
public static void dzielenie()
{
int a = 10, b = 0;
try
{
int c = a / b;
}
catch (DivideByZeroException)
{
Console.WriteLine(„Wychwycono wyjątek dzielenia przez zero w metodzie dzielenie()”);
}
}
}
class Pokaz
{
public static void Main()
{
Klasa_A.dzielenie();
}
}
Koniec kodu:
W naszym kodzie wykonujemy dzielenie przez zero w związku z tym wystąpi wyjątek i my go wychwycimy. Ale teraz spróbujemy go przerzucić w następujący sposób, zmień kod w catch na następujący:
catch (DivideByZeroException)
{
Console.WriteLine(„Wychwycono wyjątek dzielenia przez zero w metodzie dzielenie()”);
throw;
}