Skip to content

Zadanie 10

Wyjątki w języku C#

Wyjątek to obiekt reprezentujący błąd powstały w trakcie wykonania programu. W C# wszystkie wyjątki dziedziczą z klasy System.Exception, która niesie m.in. komunikat (Message) i ślad stosu (StackTrace). Mechanizm wyjątków pozwala oddzielić kod normalny od obsługi błędów.

Obsługa opiera się na blokach try-catch-finally. W bloku try umieszcza się kod mogący zgłosić błąd, w catch obsługuje się konkretne typy wyjątków, a blok finally wykonuje się zawsze (niezależnie od tego, czy wyjątek wystąpił) i służy do sprzątania, np. zamknięcia plików. Wyjątek zgłasza się słowem kluczowym throw, można też tworzyć własne klasy wyjątków dziedziczące z Exception.

// blok try zawiera kod, który może zgłosić wyjątek
try
{
// próba zamiany tekstu na liczbę
// dla "abc" nie powiedzie się i zostanie zgłoszony FormatException
int x = int.Parse("abc");
}
// pierwszy catch łapie konkretny, najbardziej szczegółowy typ wyjątku
catch (FormatException ex)
{
// ex.Message zawiera opis błędu
Console.WriteLine("Błędny format: " + ex.Message);
}
// drugi catch jest ogólniejszy i łapie wszystkie pozostałe wyjątki
// kolejność ma znaczenie: od szczegółowego do ogólnego
catch (Exception ex)
{
Console.WriteLine("Inny błąd: " + ex.Message);
}
// blok finally wykonuje się zawsze, niezależnie od tego czy był wyjątek
// służy do sprzątania, np. zamknięcia pliku czy połączenia
finally
{
Console.WriteLine("Wykonuje się zawsze (sprzatanie)");
}

Własny wyjątek tworzy się przez dziedziczenie z klasy Exception. Zwykle udostępnia się konstruktor przekazujący komunikat do klasy bazowej, można też dodać własne właściwości.

// własna klasa wyjątku dziedzicząca z Exception
public class InvalidAgeException : Exception
{
// dodatkowa właściwość przechowująca błędną wartość
public int Age { get; }
// konstruktor: przekazuje komunikat do klasy bazowej i zapisuje błędną wartość
public InvalidAgeException(string message, int age)
: base(message)
{
Age = age;
}
}

Własny wyjątek zgłasza się słowem kluczowym throw, tak samo jak wbudowany:

int age = -5;
// zgłoszenie własnego wyjątku słowem kluczowym throw
if (age < 0)
throw new InvalidAgeException("Wiek nie może być ujemny", age);

Skrót do zapamiętania: Wyjątek to obiekt błędu (dziedziczy z System.Exception), obsługiwany przez try-catch-finally; throw zgłasza wyjątek, finally wykonuje się zawsze.

  • Wyjątek = obiekt dziedziczący z System.Exception (Message, StackTrace).
  • try - kod chroniony, catch - obsługa danego typu, finally - zawsze (sprzątanie).
  • throw zgłasza wyjątek; można rzucić ponownie (rethrow).
  • Można definiować własne wyjątki dziedzicząc z Exception.
  • catch od najbardziej szczegółowego do ogólnego.