Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Wykład 7
Obsługa wyjątków
dr inż. Maciej Kusy
Katedra Podstaw Elektroniki
Wydział Elektrotechniki i Informatyki
Politechnika Rzeszowska
Programowanie w języku C#
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Plan wykładu
•
Pojęcie wyjątku, sytuacja wyjątkowa
•
Strukturalna obsługa wyjątków ( SEH)
•
Zgłaszanie wyjątków – klasa System.Excepion
•
Zgłaszanie wyjątków – instrukcja throw
•
Przechwytywanie wyjątków:
- instrukcja try
- instrukcja catch
- instrukcja finally
•
Własne niestandardowe wyjątki
2
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Pojęcie wyjątku
Wyjątek to obiekt, który pozwala przekazywać informacje
o niezwykłych zdarzeniach w programie.
Służy do obsługi błędów i nietypowych sytuacji w programie.
Uwaga: należy odróżniać od siebie błędy programisty
(pomyłka autora kodu), błędy użytkownika (wpisanie w polu tekstowym ciągu znaków zamiast liczby) i wyjątki (praca na pliku, który już nie istnieje).
Błędy programisty i błędy użytkownika mogą spowodować
zgłoszenie wyjątku.
3
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Sytuacja wyjątkowa
Brak pamięci – program znajduje się w sytuacji wyjątkowej:
etapy działania programu napisanego w środowisku .NET:
Zgłoszenie wyjątku.
Wykonywanie aktualnej metody zostaje zatrzymane.
Rozwinięcie stosu do momentu natrafienia na odpowiedni
blok obsługi wyjątku – jeżeli aktualnie wykonywana metoda
nie obsługuje wyjątku, program przerywa jej wykonywanie i
przekazuje wyjątek do metody wywołującej aktualną metodę.
Jeżeli żadna metoda nie obsługuje wyjątku, zostanie on
obsłużony przez środowisko CLR, które zakończy działanie
programu.
4
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Strukturalna obsługa wyjątków
Technologia .NET oferuje technikę strukturalnej obsługi wyjąt-ków ( SEH), której zadaniem jest właściwe reagowanie na błędy.
• Wyjątek przekazywany jest do aplikacji w formie obiektu,
którego właściwości reprezentują opis wyjątku, zapis stanu
stosu ilustrujący sekwencję wywołań, które doprowadziły do
wystąpienia wyjątku...
• Jeśli wygenerowany wyjątek nie zostanie obsłużony, wspólne środowisko uruchomieniowe zakończy działanie aplikacji.
• Kod odpowiadający za wykrywanie i obsługę błędów nie musi
się znajdować w miejscu, w którym występują błędy (kod
można umieścić np. w specjalnej klasie).
• Wyjątki stosuje się dla wszystkich błędów i wyłącznie na
poziomie aplikacji i systemu.
• Wszystkie metody platformy .NET Framework generują
5
wyjątki w odpowiedzi na napotkane błędy.
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Zgłaszanie wyjątków
W języku C# wyjątki można zgłaszać jedynie w postaci
obiektów klasy System.Exception lub obiektów
pochodnych od tego typu:, np. InvalidCastException,
IOException, ArithmeticException…
Wybrane właściwości klasy System.Exception:
Message – tekst opisujący dany wyjątek,
Source – nazwa zestawu, który wygenerował wyjątek,
StackTrace – sekwencja nazw metod, które zostały
wywołane przed wystąpieniem danego
wyjątku,
TargetSite – szczegółowe informacje o metodzie, która wygenerowała dany wyjątek.
6
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Zgłaszanie wyjątków – throw
Słowo kluczowe throw służy do zgłaszania wyjątku.
Przykładowa instrukcja:
throw new System.Exception();
tworzy nowy egzemplarz wyjątku, który jest typu
System.Exception i zgłasza go.
Zgłoszenie wyjątku powoduje natychmiastowe
zatrzymanie wykonywania programu, a środowisko
CLR rozpoczyna wyszukiwanie bloku obsługi wyjątku:
następuje rozwinięcie stosu do metody wywołującej.
7
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Przechwytywanie wyjątków – try
Do implementowania mechanizmu obsługi wyjątku
wykorzystuje się konstrukcję try-catch-finally.
Blok try ( region strzeżony) – w tej części pisane są instrukcje, które mogą spowodować wystąpienie
wyjątków (dzielenie przez zero, wykroczenie poza
zakres tablicy, praca na nieistniejącym pliku), np.:
int a = 5, b;
try
{
b = a / 0;
}
8
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Przechwytywanie wyjątków – catch
Blok catch składa się ze słowa kluczowego catch oraz wyrażenia w nawiasach ( filtr wyjątków). Filtr ten określa rodzaj wyjątku, na który dany blok będzie odpowiadał, np.:
catch (DivideByZeroException e) {}
catch (IndexOutOfRangeException e) {}
catch (Exception e) {}
Parametr e odwołuje się do obiektu wyjątku – udostępnia jego właściwości.
Kolejność bloków catch ma znaczenie – bloki należy
uporządkować hierarchicznie: od najbardziej szczegółowego
do najbardziej ogólnego (w przeciwnym wypadku kompilator
zasygnalizuje błąd).
9
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Przechwytywanie wyjątków – finally
Blok finally jest zwany blokiem czyszczącym.
Wykonywany jest niezależnie od tego, czy podczas
wykonywania bloku try wystąpił jakiś wyjątek.
Blok finally jest opcjonalny, chyba że dla bloku try nie zdefiniowano bloku catch.
Blok finally jest wygodnym sposobem przywracania
właściwego stanu systemu, np. zamknięcie pliku.
10
Programowanie w języku C#. Maciej Kusy, mkusy@prz.edu.pl
Własne niestandardowe wyjątki
Konieczność obsługi specyficznych błędów.
Występujące błędy muszą być reprezentowane przez
odpowiednie obiekty zdefiniowanej klasy.
Istnieje konieczność sprawdzenia czy nasza klasa (np.
Dokument) obsługuje nasz interfejs (IPrzechowalnia): Dokument dok;
if(dok is IPrzechowalnia == false)
{
throw new Wyjatek("Brak obslugi interfejsu");
}
11