C Sharp/Wyjątki
Z Wikibooks, biblioteki wolnych podręczników.
Wyjątki to mechanizm w programowaniu obiektowym pozwalający łatwo wyłapać błędy. Uwalnia to nas od specjalnych zmiennych i wielu instrukcji warunkowych, żeby sprawdzać czy nastąpił błąd. Jeśli nasz program nie ma w kodzie obsługi wyjątków to w pewnym sensie obsługuje je za nas framework tzn. wypisze komunikat, że nastąpił nieobsłużony wyjątek podając jego nazwę, np. IndexOutOfRangeException (w tłumaczeniu: wyjątek poza zasięgiem indeksu). Do obsługi wyjątków używamy bloku try...catch :
try { //blok, w którym może nastąpić wyjątek } catch(TypWyjątku identyfikatorWyjątku) { //instrukcje do wykonania jeśli wyjątek nastąpi w czasie wykonywania kodu z bloku try } finally { //instrukcje które wykonają się niezależnie od tego czy wyjątek zostanie wyrzucony czy nie //blok finally można pominąć }
Oczywiście można umieścić więcej bloków catch jeśli chcemy. Każdy wtedy będzie się zajmował innym typem wyjątków. Należy pamiętać, że istnieje hierarchia wyjątków:
- Exception
- SystemException
- IndexOutOfRangeException
- SystemException
Należy wyjątki obsługiwać od najniższych do najwyższych w hierarchii. Jeśli pomieszamy hierarchię to kompilator zgłosi błąd, że ten sam wyjątek chcemy obsłużyć drugi raz.
Przykład:
using System; public class main { public static void Main() { int[] tablica = {1,2,3,4,5} try { tablica[5]=6; } catch(IndexOutOfRangeException) { Console.WriteLine("Nastąpiło odwołanie poza tablicę!!!"); } } }
[edytuj] Wyrzucanie wyjątków
Możemy również sami wyrzucać wyjątki. Robimy to za pomocą instrukcji throw
using System; class Program { void KupZiemniaki(int ile) { if(ile < 0) { //nie możemy kupić ujemnej liczby czegoś więc rzucamy wyjątek //po wykonaniu instrukcji throw program wyjdzie z funkcji KupZiemniaki i //dalszy kod się nie wykona throw new Exception("Nie można kupić ujemnej liczby ziemniaków"); } //... } public static void Main() { Console.WriteLine("Ile ziemniaków chcesz kupić?"); int ilosc = int.Parse(Console.ReadLine()); try { KupZiemniaki(ilosc); } catch(Exception ex) { Console.WriteLine("Wystąpił błąd przy kupowaniu ziemniaków!") } } }