Wyjątki
W języku C#, wyjątek (ang. exception) to obiekt reprezentujący błąd, który może wystąpić podczas wykonywania kodu. Można je rzucić (ang. throw) i obsłużyć (ang. catch), aby zapobiec zatrzymaniu programu i umożliwić jego dalsze działanie. Wbudowane klasy wyjątków w C# obejmują m.in. ArgumentException, IndexOutOfRangeException i DivideByZeroException. Można też tworzyć własne klasy wyjątków dziedziczące po Exception.
W C# wyjątki są obsługiwane za pomocą czterech słów kluczowych: try
catch
finally
throw
try
{
// Kod, w którym mogą wystąpić wyjątki
}
catch (TypWyjatku nazwaZmiennej)
{
// Kod, który jest wykonywany, gdy wystąpi wyjątek typu TypWyjatku
}
catch (InnyTypWyjatku nazwaZmiennej)
{
// Kod, który jest wykonywany, gdy wystąpi wyjątek typu InnyTypWyjatku
}
finally
{
// Kod, który zawsze jest wykonywany, niezależnie od tego, czy wyjątek został rzucony czy nie
}
Można rzucić wyjątek za pomocą słowa kluczowego "throw".
throw new Exception("Mój wyjątek");
Jeśli chcesz rzucić wyjątek, który jest już zmienną, to można to zrobić przez po prostu użycie throw bez argumentów.
Exception e = new Exception("Mój wyjątek");
throw e;
Można też rzucić wyjątek jako odpowiedź na konkretny warunek.
if (age < 0)
{
throw new ArgumentException("Wiek nie może być ujemny");
}
Oto przykłady predefiniowanych wyjątków pochodzących z klasy System.SystemException
Klasa ArgumentException
string name = null;
if (name == null)
{
throw new ArgumentException("Nazwa nie może być null");
}
Nazwa nie może być null
Klasa NullReferenceException
MyClass myObj = null;
myObj.DoSomething(); // Wyświetli NullReferenceException
NullReferenceException
Klasa OutOfMemoryException
List<int> list = new List<int>();
while (true)
{
list.Add(1); // Wyświetli OutOfMemoryException po pewnym czasie
}
OutOfMemoryException
Klasa StackOverflowException
void RecursiveMethod()
{
RecursiveMethod(); // Wyświetli StackOverflowException
}
StackOverflowException
Klasa IndexOutOfRangeException
int[] array = new int[5];
array[10] = 1; // Wyświetli IndexOutOfRangeException
IndexOutOfRangeException
Klasa InvalidOperationException
Queue<int> queue = new Queue<int>();
queue.Dequeue(); // Wyświetli InvalidOperationException, ponieważ kolejka jest pusta
InvalidOperationException
Klasa ArrayTypeMismatchException
object[] array = new string[5];
array[0] = 5; // Wyświetli ArrayTypeMismatchException, ponieważ przypisuje się liczbę do tablicy typu string
ArrayTypeMismatchException
Klasa ArithmeticException
int result = 5 / 0; // Wyświetli ArithmeticException
ArithmeticException
Klasa OverflowException
int max = int.MaxValue;
int result = max + 1; // Wyświetli OverflowException
OverflowException
Klasa FormatException
int.Parse("abc"); // Wyświetli FormatException
FormatException
Te przykłady pokazują, że istnieje wiele różnych wyjątków, które mogą być rzucane przez runtime w różnych sytuacjach. Programiści powinni być świadomi tych wyjątków i być w stanie je obsłużyć, aby uniknąć zatrzymania programu.