Delegaty
i zdarzenia.
Obsługa
wyjątków
Przegląd zagadnień
Delegaty i zdarzenia
Obsługa wyjątków
Podsumowanie
Pytania sprawdzające
Laboratorium
Delegaty i zdarzenia (1)
Tworząc program, często nie wiemy z
góry, których metod, czy obiektów
chcemy użyć do określonej czynności
Możliwe jest połączenie takiego
elementu z delegatem, a następnie
wywołanie w trakcie programu
odpowiedniej metody
Zdarzenia pozwalają określić, że „coś się
w programie stało”, więc musi to
pociągnąć za sobą reakcję programu
Zdarzenia i delegaty są mocno ze sobą
związane, elastyczna obsługa zdarzenia
wymaga, by reakcje były przekazywane
do odpowiednich metod, a rolę taką
pełnią z reguły w C# właśnie delegaty
Delegaty i zdarzenia (2)
W C# delegaty są obiektami typu
referencyjnego, stanowiącego interfejs
metody o określonej sygnaturze i
zwracanym typie
Składnia:
public
delegate
typ_zwracany Nazwa(object ob_1, object ob_2)
Delegaty – przykład 1
Kod C#:
delegate
void Delegacik();
class Testowa
{
static void jeden()
{
System.Console.WriteLine("Testowa.jeden");
}
static void Main()
{
Delegacik d =
new
Delegacik(jeden);
d();
}
}
Delegaty – przykład 2
Kod C#:
public delegate void Obsluga(object sender, Event e);
public class Button: Control {
public event Obsluga onClick;
public void Reset() {
onClick = null;
}
}
using System;
public class Form1: Form {
public Form1(){
Button Przyc1 = new Button();
Przyc1_Click Przyc1.Click += new Obsluga(Przyc1_Click);
}
void Przyc_Click(object sender, Event e) {
Console.WriteLine(„Przyc1 został naciśnięty");
}
public void Disconnect() {
Przyc1.Click -= new Obsluga(Przyc1_Click);
}
}
Obsługa wyjątków
Wyjątek to obiekt przekazujący informacje
o niezwykłych zdarzeniach w programie
Należy odróżniać błędy programisty i
błędy użytkownika od wyjątków – tym z
dwóch pierwszych grup można zapobiec
przez korektę kodu czy chociażby przez
sprawdzanie poprawności danych
Wyjątkom nie da się zapobiec, można
jednak je obsłużyć, by nie powodowały
zakończenia pracy programu
W C# wszystkie wyjątki są typu
System.Exception lub obiektów pochodnych
od niego
Obsługa wyjątków – podejście
obiektowe
Klasyczne podejście opierało się na
wykorzystaniu instrukcji warunkowych,
co prowadziło do szybkiego
skomplikowania kodu
Nowy pomysł polega na
odseparowaniu części programu
odpowiadającej za zwykłe działanie od
fragmentu opisującego zachowanie w
razie wystąpienia błędu, co w praktyce
realizuje się:
try
{
// kod w normalnym toku, z potencjalnym miejscem
// wystąpienia wyjątku
}
catch
{
// zestaw instrukcji realizowanych w przypadku
// wystąpienia wyjątku
}
Obsługa wyjątków – przykład 1
Kod C#
using System;
namespace PrzechwytywanieWyjatku {
public class Test {
public static void Main() {
try
{
Console.WriteLine("Początek metody Main..");
throw
new System.Exception();
Console.WriteLine("Koniec metody Main...");
}
catch
{
Console.WriteLine("Wyjątek przechwycony i
obsłużony");
}
}
}
}
Obsługa wyjątków – przykład 2
Kod C#
using System;
namespace PrzechwytywanieWyjatku2 {
public class Test {
public static void Main() {
Test t = new Test();
t.TestFunc(); }
public void TestFunc() {
try
{
double a = 5;
double b = 0;
Console.WriteLine("{0} / {1} = {2}", a, b, Dv(a, b)); }
catch
(System.DivideByZeroException) {
Console.WriteLine("Wyjątek DivideByZeroException"); }
catch
(System.ArithmeticException) {
Console.WriteLine("Wyjątek ArithmeticException"); }
}
public double Dv(double a, double b) {
if (b == 0)
throw new System.DivideByZeroException();
if (a == 0)
throw new System.ArithmeticException();
return a / b;
}
}
}
Obsługa wyjątków – dodatkowe
informacje
W programie można kilkakrotnie
wykorzystać blok catch – obsługując
wyjątki od najbardziej
wyspecjalizowanego do najogólniejszego
Możliwe jest także przygotowanie kodu,
który wykona się niezależnie od
wystąpienia wyjątku – służy do tego celu
słowo kluczowe finally, za którym można
umieścić stosowny blok instrukcji
Dzięki powyższemu mechanizmowi
mamy możliwość uniknięcia duplikacji
kodu, a także zamknięcia pliku czy
chociażby zwolnienia stosu
Podsumowanie
Używania wyjątków należy unikać w
zwykłych lub przewidywalnych
przypadkach
Należy zawsze tworzyć i wyrzucać
elementy klas pochodnych od
Exception
Warto dołączać słowny opis problemu
do obsługi wyjątku – pozwoli to się
lepiej zorientować w przyczynie jego
wystąpienia
Pytania sprawdzające
Do czego służą delegaty?
W jaki sposób delegaty mogą obsłużyć
zdarzenia?
Podaj podstawowe różnice pomiędzy
błędem programisty a wyjątkiem.
Czy w programie można umieścić kod,
który wykona się niezależnie od
wystąpienia wyjątku? W jaki sposób?
Laboratorium