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

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 int Main()
	{
		int[] tablica = {1,2,3,4,5}
		try
		{
			tablica[5]=6;
		}
		catch(IndexOutOfRangeException) 
		{
			Console.WriteLine("Nastąpiło odwołanie poza tablicę!!!");
		}
                return 0;
	}
}


Wyrzucanie wyjątków[edytuj]

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 int 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!");
		}
                return 0;
	}
}
Poprzedni rozdział: Tablice
Następny rozdział: Interfejsy