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ątektry{ // 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ątkucatch (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ólnegocatch (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łączeniafinally{ 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 Exceptionpublic 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 throwif (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.