Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Podobne dokumenty
Qt sygnały i sloty. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Wydział Elektroniki Politechnika Wrocławska

Wprowadzenie do szablonów klas

Szablony funkcji i szablony klas

Referencje do zmiennych i obiektów

Operacje wejścia/wyjścia (odsłona druga) - pliki

Przestrzenie nazw. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Programowanie w C++ Wykład 6. Katarzyna Grzelak. kwiecień K.Grzelak (Wykład 6) Programowanie w C++ 1 / 40

Zaawansowane programowanie w języku C++ Wyjątki

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 7 maja K.Grzelak (Wykład 8) Programowanie w C++ 1 / 31

Rzutowanie i konwersje

Wyjątki (exceptions)

Wyliczanie wyrażenia obiekty tymczasowe

Qt sygnały i designer

Kurs programowania. Wykład 3. Wojciech Macyna. 22 marca 2019

ATD. Wykład 8. Programowanie (język C++) abstrakcyjny typ danych. Abstrakcyjne typy danych (ATD) Metody czysto wirtualne. Definicje i uwagi:

Obsługa wyjątków. Język C++ WW12

Wykład 1. Program przedmiotu. Programowanie Obiektowe (język C++) Literatura. Program przedmiotu c.d.:

Schemat konstrukcja pliku Makefile

Praca z aplikacją designer

Efekty uboczne błędów

Obsługa błędów za pomocą wyjątków. Paweł Motofa (140746)

Składnia C++ Programowanie Obiektowe, część 3 Mateusz Cicheński

Język C++ wykład VIII

Zasoby, pliki graficzne

Szablon klasy std::vector

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

IMIĘ i NAZWISKO: Pytania i (przykładowe) Odpowiedzi

Hermetyzacja oraz pola i metody statyczne

Przesłanianie nazw, przestrzenie nazw

Zaawansowane programowanie w języku C++ Programowanie obiektowe

Wykład V. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Programowanie w języku C++

Wykład 1. Program przedmiotu. Programowanie (język C++) Literatura. Program przedmiotu c.d.:

DYNAMICZNE PRZYDZIELANIE PAMIECI

Weryfikatory, zasoby graficzne

Operacje wejścia/wyjścia odsłona pierwsza

Wprowadzenie do szablonów szablony funkcji

Zad.30. Czy można utworzyć klasę, która implementuje oba interfejsy?

Klasyfikacja wyjątków

Szablon klasy std::list

Konstruktor kopiujacy

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

Języki i metody programowania Java INF302W Wykład 3 (część 1)

Wprowadzenie do szablonów szablony funkcji

Pola i metody statyczne

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

Język C++ Różnice między C a C++

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

Programowanie obiektowe

Programowanie w C++ Wykład 8. Katarzyna Grzelak. 15 kwietnia K.Grzelak (Wykład 8) Programowanie w C++ 1 / 33

Programowanie obiektowe

Wykład II. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Czujniki PSD i dalmierze triangulacyjne

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 20 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 32

Wprowadzenie do UML, przykład użycia kolizja

Wyjątki Monika Wrzosek (IM UG) Programowanie obiektowe 180 / 196

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

TEMAT : KLASY DZIEDZICZENIE

PARADYGMATY PROGRAMOWANIA Wykład 4

Pętle i tablice. Spotkanie 3. Pętle: for, while, do while. Tablice. Przykłady

Wykład 8: klasy cz. 4

Wstęp do Programowania 2

Programowanie 2. Język C++. Wykład 3.

Zaawansowane programowanie w C++ (PCP)

W2 Wprowadzenie do klas C++ Klasa najważniejsze pojęcie C++. To jest mechanizm do tworzenia obiektów. Deklaracje klasy :

Programowanie w języku C++

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Składnia C++ Programowanie Obiektowe Mateusz Cicheński

Wykład 8: Obsługa Wyjątków

WYJĄTKI. Jest ona jednak czasochłonna i prowadzi do duŝego zapotrzebowania na zasoby systemu.

Throwable. Wyjatek_1(int x_) { x = x_; } int podaj_x()

Programowanie w C++ Wykład 14. Katarzyna Grzelak. 3 czerwca K.Grzelak (Wykład 14) Programowanie w C++ 1 / 27

Programowanie w C++ Wykład 12. Katarzyna Grzelak. 28 maja K.Grzelak (Wykład 12) Programowanie w C++ 1 / 27

Dalmierze optyczne. Bogdan Kreczmer.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Podstawy programowania skrót z wykładów:

Programowanie w C++ Wykład 11. Katarzyna Grzelak. 13 maja K.Grzelak (Wykład 11) Programowanie w C++ 1 / 30

Podstawy i języki programowania

Papyrus. Papyrus. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

PARADYGMATY PROGRAMOWANIA Wykład 2

Zaawansowane programowanie w języku C++ Klasy w C++

Podstawy programowania w języku C++

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Programowanie w C++ Wykład 13. Katarzyna Grzelak. 4 czerwca K.Grzelak (Wykład 13) Programowanie w C++ 1 / 26

Programowanie obiektowe w C++ Wykład 12

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Wstęp do programowania obiektowego. Przekazywanie parametrów do funkcji w C++ Metody i funkcje operatorowe Strumienie: standardowe, plikowe, napisowe

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Operatory na rzecz typu TString

Programowanie w C++ Wykład 9. Katarzyna Grzelak. 14 maja K.Grzelak (Wykład 9) Programowanie w C++ 1 / 30

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Język C++ wykład VI. uzupełnienie notatek: dr Jerzy Białkowski. Programowanie C/C++ Język C++ wykład VI. dr Jarosław Mederski.

Kurs programowania. Wykład 2. Wojciech Macyna. 17 marca 2016

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Organizacja kursu, paradygmaty, ogólnie o C i C++

Transkrypt:

Bogdan Kreczmer bogdan.kreczmer@pwr.edu.pl Katedra Cybernetyki i Robotyki Politechnika Wrocławska Kurs: Copyright c 2018 Bogdan Kreczmer Niniejszy dokument zawiera materiały do wykładu dotyczącego programowania obiektowego. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych prywatnych potrzeb i może on być kopiowany wyłącznie w całości, razem z niniejszą stroną tytułową.

Niniejsza prezentacja została wykonana przy użyciu systemu składu L A TEX oraz stylu beamer, którego autorem jest Till Tantau. Strona domowa projektu Beamer: http://latex-beamer.sourceforge.net

Plan prezentacji 1 standardowe

Plan prezentacji standardowe 1 standardowe

Tradycyjny sposób obsługi błędów standardowe int Funkcja1() if (Gdy cos jest zle) errno = KOD BLEDU; return -1; return 0; int Funkcja() int err; if (Funkcja1() < 0) / Obsługa błędu / if (Jezeli nie mozemy sobie poradzic) return -1; if ((err = Funkcja2()) < 0) / Obsługa błędu / return 0;

Czym jest obsługa wyjątków standardowe w C++ są sposobem na oddzielenie wykrywania błędów od ich obsługi. Mechanizm obsługi wyjątków jest nielokalną strukturą sterującą, która korzysta ze zwijania stosu. Zwijaniem stosu nazywamy proces przeszukiwania stosu w celu znalezienia procedury obsługi wyjątku. Mechanizmy obsługi wyjątków służą do sygnalizowania i obsługi zdarzeń wyjątkowych. Jednak to programista musi zdecydować co to znaczy wyjątkowy w danym programie. często w sposób naturalny tworzą rodziny. Oznacza to, że dziedziczenie może być użyteczne w strukturalizacji wyjątków i ich obsłudze.

Plan prezentacji standardowe 1 standardowe

standardowe Obsługa wyjątków trochę tradycyjnie int Funkcja1( ) if (Gdy cos jest zle) throw KOD BLEDU; //.. Tutaj zgłaszamy wyjątek int Funkcja( ) try //.. W tej sekcji zakładamy możliwość zgłoszeń wyjątki Funkcja1( ); //.. catch (int err) //.. Tutaj rozpoczyna się przechwytywanie i obsługa wyjątków switch (err) case KOD BLEDU: if (Jezeli nie mozemy sobie poradzic) throw KOD BLEDU; break ; //..

standardowe Przepływ sterowania przypadek braku zgłoszenia wyjątku int Funkcja(int arg) try // cout << Tu coś się dzieje. << endl; //. catch (int const wskkomunikat) catch (int Komunikat) catch ( ) // // Dalsza część kodu

standardowe Przepływ sterowania przypadek zgłoszenia wyjątku int Funkcja(int arg) try // throw 10; //. catch (int const wskkomunikat) catch (int Komunikat) cout << Obsługa zgłoszenia. << endl; catch ( ) // // Dalsza część kodu

standardowe Zgłoszenia wyjątku wcześniejszy powrót z funkcji int Funkcja(int arg) try // throw 10; //. catch (int const wskkomunikat) catch (int Komunikat) return 2; catch ( ) // // Dalsza część kodu

Funkcja w sekcji try standardowe [Gdy arg == 0] int Funkcja(int arg) //.. try if ( arg == 0 ) throw 10; // Ta część kodu jest osiągalna warunkowo return 0; //.. catch (int const wskkomunikat) return 0; catch (int Komunikat) return -2; catch ( ) return 0; // Sekcje catch muszą zwracać wartość tego samego typu co funkcja.

standardowe Problem kopiowania zgłaszanej wartości class Blad Blad( Blad const & ) Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) nr bledu = nr; ; ; void Funkcja(int arg) try throw Blad(3); catch ( Blad &Bl ) cout << Nr Bledu: << Bl. nr bledu << endl;

standardowe Problem kopiowania zgłaszanej wartości class Blad Blad( Blad const & ) Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) nr bledu = nr; ; ; void Funkcja(int arg) try throw Blad(3); catch ( Blad &Bl ) cout << Nr Bledu: << Bl. nr bledu << endl; Zgłoszenie wyjątku powoduje zawsze przekopiowanie parametru polecenia throw.

standardowe Ominięcie problemu kopiowania obiektu class Blad Blad( Blad const & ) Kopiowanie obiektu jest niemożliwe (poza tą klasą) public : int nr bledu; Blad(int nr = 0) nr bledu = nr; ; ; void Funkcja(int arg) try throw new Blad(3); catch ( const Blad wb ) cout << Nr Bledu: << B-> nr bledu << endl; delete wb; W tym przypadku kopiowany jest jedynie wskaźnik.

standardowe Hierarchia klas na potrzeby wyjątków class Blad public : virtual const char Info() const return Blad ogolny ; virtual Blad() ; class BladObliczen: public Blad public : virtual const char Info() const return Blad obliczen ; ; class BladInicjalizacji: public Blad public : virtual const char Info() const return Blad inicjalizacji ; ; Dziedziczenie pozwala na uszczegóławianie modeli pojęć (klas). Ten mechanizm wraz z niejawnym rzutowaniem w górę wykorzystywany w tworzeniu hierarchii wyjątków.

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (2.2+2.2+2.2!= 6.6) throw BladObliczen(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; W Sekcje catch przeglądane są od pierwszej do ostatniej. Dlatego też najpierw muszą pojawić się sekcje, których parametrami są obiekty klasy pochodnej.

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (2.2+2.2+2.2!= 6.6) throw BladObliczen(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; A jaki będzie wynik działania tej funkcji?

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (2.2+2.2+2.2!= 6.6) throw BladObliczen(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; Wynik działania P: Blad obliczen Ze względu na skończoną reprezencję liczb proste działanie nie da, zdawałoby się, oczywistego wyniku. Zgłoszony zostanie wyjątek BladObliczen.

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (Wsk!= nullptr) throw BladInicjalizacji(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; A dla tego przypadku jaki będzie wynik działania tej funkcji?

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (Wsk!= nullptr) throw BladInicjalizacji(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; Wynik działania P: Blad inicjalizacji Prawie na pewno zostanie zgłoszony wyjątek BladObliczen, gdyż zmienne lokalne (automatyczne) nie są domyślnie inicjalizowane. Zgłoszony wyjątek zostanie przechwycony przez drugą sekcję dzięki niejawnemu rzutowaniu w górę.

Niejawne rzutowaine w górę standardowe void Test() void Wsk; try if (Wsk!= nullptr) throw BladInicjalizacji(); cout << OK << endl; catch (const BladObliczen &Ob) cout << P: << Ob.Info() << endl; catch (const Blad &Ob) cout << B: << Ob.Info() << endl; Wynik działania P: Blad inicjalizacji Wynik działania funkcji zależy do tego jakie śmieci znajdą się w zmiennej Wsk. Może się zdarzyć, że będą same zera. Dlatego też nie można powiedzieć na pewno jaki będzie wynik działania funkcji dla tego przypadku.

Zwalnianie zasobów standardowe void Funkcja(int arg) FILE wpolecenie = popen( last -n 100, r ); try catch ( ) pclose(wproc); throw ; pclose(wproc); W przypadku zasobów, które nie mają charakteru lokalnego (np. dynamicznie przydzielana // Powt orne pamięć), zg loszenie należy pamiętać, wyj atkuaby zwalniać je w trakcie obsługi zgłoszonego wyjątku.

inaczej standardowe #include <iostream> #include <vector> #include <stdexcept> //Tu znajduje się definicje wyjątku std::out of range int PrzegladajTablice( const std::vector<int> &Tablica ) try for (int ind = 0; ; ++ind) if (Tablica.at(ind) / 2) std::cout << Tablica.at(++ind) << std::endl; catch (std::out of range) Zgłoszenie wyjątku może być sposobem na przerwanie return 0; pętli w sytuacji, gdy bezpośrednie sprawdzanie warunku jest kłopotliwe w zapisie i sprawdzenie to musiałoby return 0; występować w wielu miejscach. Zgłoszenie wyjątku może być pomocne również w przypadkach konstrukcji niestrukturalnych, w których wykorzystywano instrukcję goto.

standardowe Konwersje typów w obsłudze wyjątków class Wektor2f // public : Wektor2f( ); ; // class LZespolona //. public : LZespolona( ); LZespolona(const Wektor2f &W); ; // int main() try throw Wektor2f( ); Przy obsłudze wyjątków domyślne konwersje nie są realizowane. catch (LZespolona Z) // Czy wyjątek zgłoszony powyżej zostanie tu obsłużony?

Plan prezentacji standardowe 1 standardowe

Przykładowe wyjątki standardowe standardowe Standardowe wyjątki zgłaszane przez język Nazwa Zgłaszane przez Nagłówek bad alloc new <new> bad cast dynamic cast <typeinfo> bad typeid typeid <typeinfo> bad exception specyfikacja wyjątku <exception> Przykłady standardowych wyjątków zgłaszanych przez bibliotekę STL Nazwa Zgłaszane przez Nagłówek out of range at() <stdexcept> bitset< >::operator []() <stdexcept> invalid argument konstruktor bitset <stdexcept> overflow error bitset< >::to ulong() <stdexcept> ios base::failure ios base::clear() <ios>

Hierarchia wyjątków standardowe

standardowe Ustawianie handlera dla obsługi wyjątków C++ unexpected handler set unexpected(unexpected handler fun) throw(); C++11 unexpected handler set unexpected(unexpected handler fun) noexcept;

standardowe dla operacji wejścia/wyjścia int main ( ) ifstream Plik; int Liczba; Plik.exceptions( ifstream ::failbit ifstream ::badbit ); try Plik.open( zbior liczba.txt ); while (!Plik.eof()) Plik >> Liczba; catch (ifstream ::failure) cout << Wyjątek operacji otwarcia lub czytania ; return 0;

Koniec prezentacji Dziękuję za uwagę