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