24
- p. 1/24 Zaawansowane programowanie w C++ (PCP) Wyklad 5 - obsluga bl˛ edów. Mechanizm wyj ˛ atków. dr in ˙ z. Robert Nowak

Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

  • Upload
    hathien

  • View
    219

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

- p. 1/24

Zaawansowane programowanie w C++ (PCP)

Wykład 5 - obsługa błedów.Mechanizm wyjatków.

dr inz. Robert Nowak

Page 2: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

- p. 2/24

Powtórzenie - wzorce projektowe

� wzorce kreacyjne� fabryka abstrakcyjna (abstract factory)� prototyp (prototype)� singleton (singleton)

� wzorce strukturalne� adapter (wrapper)� fasada (fasade)� most (bridge)� proxy (proxy)� kompozyt (composite)

� wzorce czynnosciowe� iterator (iterator)� polecenie (command)� odwiedzajacy (visitor)� obserwator (observer)� interpreter (interpreter)� strategia (strategy)� stan (state)

Page 3: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

- p. 3/24

Wzorzec wizytatora

� ustalona hierarchia klas� wiele metod, metody moga sie zmieniac

Element

+ accept(Visitor)

Wizytator

+ wizytuj(ElementA*)

+ wizytuj(ElementB*)

+ wizytuj(ElementC*)

KonkretnyWizytator1

+ wizytuj(ElementA*)

+ wizytuj(ElementB*)

+ wizytuj(ElementC*)

KonkretnyWizytator2

+ wizytuj(ElementA*)

+ wizytuj(ElementB*)

+ wizytuj(ElementC*)

ElementA

+ accept(Visitor)

ElementB

+ accept(Visitor)

ElementC

+ accept(Visitor)

Hierarchia klas

Page 4: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

- p. 4/24

Wizytator (2)

class Visitor; //Deklaracja

class Element { //Klasa bazowa

virtual void accept(Visitor& v) = 0;

};

/ * Deklaracje konkretnych elementów * /

class Visitor { //Abstrakcyjny wizytator

public:

virtual void visit(ElementA&) = 0;

virtual void visit(ElementB&) = 0;

virtual void visit(ElementC&) = 0;

};

class ElementA : public Element {

public:

virtual void accept(Visitator& v) {

v.visit( * this); //Woła metode visit(ElementA&)

}

//Dalsza cze s c implementacji klasy ElementA

};

Page 5: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

» Mechanizmy obsługi błedów

» kod powrotu

» zmienna globalna

» błedny stan obiektu

Wyjatki

- p. 5/24

Mechanizmy obsługi błedów

� autor klasy (biblioteki) moze wykryc bład, lecz nie wie, co znim zrobic

� uzytkownik klasy (biblioteki) wie co zrobic z błedem, lecz niepotrafi go wykryc

Mechanizmy:� Nieprawidłowe:

� ignorowanie błedów� konczenie działania programu� komunikaty dla uzytkownika.

� Kłopotliwe:� kod powrotu� zmienna globalna: ostatni bład� specjalny błedny stan obiektu.

� Mechanizm wyjatków.

Page 6: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

» Mechanizmy obsługi błedów

» kod powrotu

» zmienna globalna

» błedny stan obiektu

Wyjatki

- p. 6/24

kod powrotu

Metoda zwraca wartosc, która jest interpretowana jakopowodzenie (lub niepowodzenie) pewnej operacji.

class Wektor {

//...

bool add(int i); //Zwraca false gdy niepowodzenie

};

//Przykład u zycia

Foo foo;

if(!foo.add(4)) //Sprawdzanie, czy nie wystapił bład

//Tutaj kod obsługi błedu

Mechanizm niewygodny poniewaz:� rezerwacja zwracanej wartosci na kod błedu� kazda funkcja musi byc badana, czy nie sygnalizuje

wystapienia błedu� programista moze zignorowac fakt wystapienia błedu� kod obsługi błedów wymieszany z innym kodem

Page 7: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

» Mechanizmy obsługi błedów

» kod powrotu

» zmienna globalna

» błedny stan obiektu

Wyjatki

- p. 7/24

zmienna globalna

Funkcja, która sygnalizuje wystapienie błedu ustawiaodpowiednia wartosc zmiennej globalnej. Mechanizm typowydla ’C’ (#include <errno.h> )

extern int errno; //Zmienna globalna, przechowuje kody błedów

class Plik {

//...

zapisz(const char * buf); //Ustawia errno gdy wystapi bład

};

Plik p; //Przykład u zycia

p.zapisz(buforA);

if(errno == ENOFILE) //Sprawdzanie, czy wystapił okre slony bład

//Obsługa błedu

� obiekt globalny - potencjalne zródło kłopotów� nalezy co jakis czas sprawdzac wartosc� programista moze zignorowac fakt wystapienia błedu� kod obsługi błedów wymieszany z innym kodem

Page 8: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

» Mechanizmy obsługi błedów

» kod powrotu

» zmienna globalna

» błedny stan obiektu

Wyjatki

- p. 8/24

błedny stan obiektu

Przykład:

class Macierz {

public:

//Tworzy macierz o podanych rozmiarach

explicit Macierz(int sizeX=2, int sizeY=2);

Macierz operator+(const Macierz& m) const {

if(m.sizeX() != sizeX() || m.sizeY() != sizeY() )

return Macierz(-1,-1); //błedna macierz

//...

Wady:� nie zawsze jest mozliwe wprowadzenie wartosci błednej� programista moze zignorowac fakt wystapienia błedu

Page 9: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 9/24

Mechanizm wyjatków

class Wektor {

int * tab;

int rozm;

public:

class Zakres{ }; //Klasa wyjatku

int& operator[](int index);

};

int& Wektor::operator[](int i) {

if(i >= 0 && i < rozm) return tab[i];

else throw Zakres(); //Funkcja biblioteczna rzuca wyjatek

}

void f(Wektor& w) {

try { //Funkcja u zytkownika bedzie przechwytywa c wyjatki

g(w);

}

catch(Wektor::Zakres) { //Procedura obsługi wyjatku

//kod obsługi błedu

}

}

Page 10: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 10/24

Wyjatki w konstruktorachrozróznianie wyjatków

class Wektor {

static const int MAX = 32000;

//Składowe takie jak poprzednio

public:

class Rozmiar { }; //klasa wyjatku złego rozmiaru

Wektor(int r);

};

Wektor::Wektor(int r) {

if(r < 0 || r >= MAX) throw Rozmiar(); //Zgłaszanie błedu w

//utworzenie obiektu

}

void f() {

try {

//u zywaj wektorów

}

catch(Wektor::Zakres) { / * obsługa błedu zakresu * / }

catch(Wektor::Rozmiar) { / * obsługa błedu rozmiaru * / }

}

Page 11: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 11/24

Składnia

� blok-try:try instrukcja-złozona lista-proc-obsługi

� lista-proc-obsługi:proc-obsługi [lista-proc-obsługi]

� proc-obsługi:catch ( deklaracja-wyjatku ) instrukcja-złozona

� deklaracja-wyjatku:lista-specyfikatorów-typu deklaratorlista-specyfikatorów-typu. . .

� wyrazenie-zgłoszenia:throw [wyrazenie]

� specyfikacja-wyjatków:throw [ ( lista-typów ) ]

Page 12: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 12/24

Klasy, które reprezentuja błedy

Nie uzywaj typów standardowych dosygnalizowania błedów

� Powinny dziedziczyc po std::exception , posiadaja funkcjewirtualne

� Tworzone podczas zgłaszania wyjatku w specjalnym miejscu� Konstruktor nie moze zgłaszac wyjatków!� Dostarcza konstruktora kopiujacego� rzucanie przez wartosc, przechwytywane przez referencje

//Przykładowa klasa błedu przy konwersji napisu na liczb˛ e

class InputException : public std::exception {

char bad_char;

public:

InputException(char c) : bad_char(c) {}

InputException(const InputException& e) throw()

: bad_char(e.bad_char){}

char getBadChar() const return bad_char;

};

Page 13: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 13/24

Grupowanie wyjatków

class ExceptionMat : public std::exception {

};

class ExceptionDzielZero : public ExceptionMat {

//Składowe i metody specyficzne dla tego błedu

};

class ExceptionNadmiar : public ExceptionMat {

//Składowe i metody specyficzne dla tego błedu

};

Procedura obsługi dla wyjatku wywołuje sie gdy:� typ uzyty do wyłapywania wyjatku jest identyczny jak typ

rzuconego wyjatku� typ uzyty do wyłapywania jest klasa podstawowa

Page 14: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 14/24

Rzucanie wyjatku

� przez wartosc (obiekt jest tworzony w specjalnym miejscu)� przez wskaznik - problemy z zarzadzaniem pamiecia

int my_atoi(const string& str) {

for(int i=0;i<str.size();++i) {

char curr = str[i];

if(!isdigit(curr) )

throw InputException(curr);

/ * implementacja * / ;

};

Page 15: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 15/24

Obsługa wyjatku

Wyjatki nalezy łapac przez referencje (unika sie kopiowania)

Istotna jest kolejnosc sekcji catch

try { / * Kod, który mo ze wyrzuci c wyjatek * / }

catch(const std::ios_base::failure&) { / * bład strumienia * / }

catch(const std::exception&) { / * dowolny wyjatek std * / }

Odrzucenie wyjatku

try {

//Kod, który mo ze zgłosi c wyjatek

}

catch(const ExceptionMat&) {

//Zrób, co sie da

throw; //zgło s ponownie wyjatek

}

Page 16: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 16/24

Standardowe klasy wyjatków

bad_alloc bad_cast bad_typeid

exception

out_of_range

bad_exception

logic_error runtime_error

invalid_argument overflow_error

ios_base::failure

Nazwa zgłaszajacy

bad_alloc new

bad_cast dynamic_cast

bad_typeid typeid

bad_exception throw

Wyjatki biblioteki standardowej (std)Nazwa kto zgłasza

out_of_range at()

invalid_argument bitset

overflow_error bitset

ios_base::failure clear()

Page 17: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 17/24

mechanizmów wyjatków a zasoby

� inny mechanizm powrotu� korzysta ze zwijania stosu

void f1() {

int * tmp = new int;

//Kod, który u zywa tmp i mo ze rzuci c wyjatkiem

delete tmp;

}

//Nieudolna poprawa

void f2() {

int * tmp = new int;

try {

//Kod, który u zywa tmp i mo ze rzuci c wyjatkiem

}

catch(...) { //Przechwytuje wszystkie wyjatki

delete tmp; throw;

}

delete tmp;

}

Page 18: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 18/24

Zdobywanie zasobów jest inicjowaniem

class WskaznikDoInt {

int * ptr;

public:

WskaznikDoInt(int * p) : ptr(p) { }

˜WskaznikDoInt() { delete ptr; }

operator int * () { return ptr; }

int * get() { return ptr; }

}

void f3() {

WskaznikDoInt pi(new int);

( * tmp) = 4; //przykładowy kod wykorzystujacy obiekt pi

//Kod, który u zywa wskaznika mo ze rzuci c wyjatkiem

} //destruktor obiektu lokalnego pi wywoła operator delete

Page 19: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 19/24

Zdobywanie zasobów jest inicjowaniem

class WskaznikDoPliku {

FILE * p;

public:

WskaznikDoPliku(const char * nazwa, const char * atr) {

p = fopen(nazwa, atr);

}

˜WskaznikDoPliku() { fclose(p); }

operator FILE * () { return p; }

}

Page 20: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 20/24

Wyjatki niewyłapane

Funkcja terminate()� domyslna implementacja: exit(1)

� zmiana zachowania domyslnego:

typedef void( * PFV)();

PFV set_terminate(PFV);

� przykład:

void bladKrytyczny(){

ErrorLog::getInstance().errorMsg(¨nie wyłapany wyjat ek¨);

exit(1);

}

int main() {

set_terminate(&bladKrytyczny);

catch(...) - przechwytuje wszystkie wyjatki.

Wyjatki w destruktorach

Page 21: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 21/24

Specyfikacja interfejsu

� Mozna okreslic jakie wyjatki zgłasza ze funkcja (metoda)void f() throw (ExceptionMat);

� funkcja (metoda) która nie zgłasza wyjatków:void f() throw ();

� jezeli nie ma sekcji throw w deklaracji funkcji przyjmuje sie,ze moze ona zgłaszac dowolny wyjatek

� wyjatek bad_exception

� metoda unexpected() - domyslnie woła terminate()

� zmiana zachowania domyslnego

typedef void( * PFV)();

PFV set_unexpected(PFV);

Page 22: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 22/24

Podsumowanie

Rodzaje klas:� klasy autonomiczne� klasy bazowe dla hierarchii klas� klasy wyjatków

� biblioteka nie powinna przerywac działanie programu� biblioteka nie powinna drukowac komunikatu o błedzie� nie kazda funkcja musi obsługiwac kazdy mozliwy bład� funkcja main powinna obsługiwac wszystkie wyjatki� stosuj zasade „zdobywanie zasobów jest inicjowaniem”

uzywaj wyjatków do obsługi błedów!

Page 23: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 23/24

boost::scoped_ptr

� Odpowiada dokładnie strategii „zdobywanie zasobów jestinicjowaniem”

� Destruktor usuwa wskaznik� Zabronione kopiowanie

template<typename T> class scoped_ptr : noncopyable {

public:

explicit scoped_ptr(T * p = 0);

˜scoped_ptr(); //Usuwa obiekt wskazywany

void reset(T * p = 0); //Zmienia wskaznik

T& operator * () const;

T* operator->() const;

T* get() const;

};

void f() {

scoped_ptr<MojaKlasa> klasa(new MojaKlasa);

//kod, który mo ze wyrzuca c wyjatki

} //Destruktor klasy auto_ptr wywoła operator delete

Page 24: Zaawansowane programowanie w C++ (PCP)info.wsisiz.edu.pl/~rno/wykl05-wyjatki.pdfZaawansowane programowanie w C++ (PCP) Wykład 5 - obsługa błe˛dów. Mechanizm wyja˛tków. dr inz

» Powtórzenie - wzorce

projektowe

» Wzorzec wizytatora

» Wizytator (2)

Mechanizmy obsługi błedów

Wyjatki

» Mechanizm wyjatków

» Wyjatki w konstruktorach

rozróznianie wyjatków

» Składnia» Klasy, które reprezentuja

błedy

» Grupowanie wyjatków

» Rzucanie wyjatku

» Obsługa wyjatku

» Standardowe klasy wyjatków

» mechanizmów wyjatków a

zasoby

» Zdobywanie zasobów jest

inicjowaniem

» Zdobywanie zasobów jest

inicjowaniem

» Wyjatki niewyłapane

» Specyfikacja interfejsu

» Podsumowanie

» boost::scoped_ptr

» „Wzorzec pimpl”

- p. 24/24

„Wzorzec pimpl”

Ukrywanie implementacji:

class Foo {

public:

//Interfejs klasy

private:

struct Impl; //Deklaracja poprzedzajaca

scoped_ptr<Impl> pImpl_; //Sprytny wskaznik

};