PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach.

Slides:



Advertisements
Podobne prezentacje
C++ wykład 2 ( ) Klasy i obiekty.
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Język C/C++ Funkcje.
C++ wykład 7 ( ) Wyjątki.
Klasa listy jednokierunkowej Przekazywanie parametrów do funkcji
Dzisiejszy wykład Wyjątki.
Programowanie obiektowe
Wzorce.
Prowadzący: mgr inż. Elżbieta Majka
Dziedziczenie. Po co nam dziedziczenie? class osoba { char * imie, char * imie, * nazwisko; * nazwisko;public: void wypisz_imie(); void wypisz_imie();
Bezpieczeństwo wyjątków w C++: OpenGL
formatowanie kodu źródłowego
Szablony (wzorce) Przykład 1: Szablon klasy -
Licznik template<class Count_Type> class Count { public:
DZIEDZICZENIE · klasy bazowe i klasy pochodne WyświetlAutora( ) Autor
Bartosz Walter Inżynieria oprogramowania Lecture XXX JavaTM – część II Bartosz Walter
Podstawy informatyki Wirtotechnologia – Wskaźniki i referencje
Podstawy informatyki Powtórka Grupa: 1A Prowadzący: Grzegorz Smyk
Struktury.
Tablice.
C++ wykład 2 ( ) Klasy i obiekty.
C++ wykład 7 ( ) Wyjątki. Ogólne spojrzenie na wyjątki Wyjątki zaprojektowano do wspierania obsługi błędów. System wyjątków dotyczy zdarzeń synchronicznych.
Wykład 1: Wskaźniki Podstawy programowania Programowanie w C
Czytanie, pisanie i rysowanie – cd.. Jeszcze jeden strumyk PrintStream działa jak PrintWriter, ale: Używa domyślnego (systemowego) kodowania Nie wyrzuca.
Podstawy programowania II
Programowanie obiektowe III rok EiT
Programowanie urządzeń mobilnych – wykład IV
Podstawy informatyki 2013/2014
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Programowanie obiektowe III rok EiT
Programowanie obiektowe III rok EiT
Andrzej Repak Nr albumu
Inicjalizacja i sprzątanie
Seminarium problemowe
Programowanie obiektowe Wykład 3 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21 Dariusz Wardowski.
Programowanie obiektowe Wykład 6 dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/14 Dariusz Wardowski.
Podstawy informatyki 2013/2014 Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Przekazywanie parametrów do funkcji oraz zmienne globalne i lokalne
Programowanie obiektowe 2013/2014
Kurs języka C++ – wykład 3 ( )
K URS JĘZYKA C++ – WYKŁAD 7 ( ) Wyjątki.
Kurs języka C++ – wykład 4 ( )
K URS JĘZYKA C++ – WYKŁAD 1 ( ) Łagodne wprowadzenie do języka C++
Konstruktory i Destruktory. Konstruktor Konstruktor — co to? Konstruktor — co to? jest metodą służącą do inicjowania obiektów danej klasy jest metodą.
Wyjątki. Po co nam wyjątki? Często pisząc jakiś kod staramy się go uczynić uniwersalnym, jesteśmy w stanie wykryć sytuacje niepoprawne, ale nasz kod może.
Paweł Starzyk Obiektowe metody projektowania systemów
Zestaw pytań nr. 3 Typy generyczne Wyjątki OPRACOWALI: JAKUB GRYCZEWSKIKINGA ROSA DANIEL KAPTEJNYWOJCIECH ŁĘCZYCKI
Dziedziczenie Wykład 7 Dziedziczenie sekwencyjne
Wykład 4 Klasa Vec, której konstruktory alokują pamięć dla obiektów 1.Przykład definicji klasy Vec 2.Definicje konstruktorów i destruktora 3.Definicja.
Wykład 2 Klasa Zesp i jej hermetyzacja 1.Przykład definicji klasy Zesp 2.Zmiana definicji klasy 3.Zmienne i funkcje statyczne PO2-1 / 28.
Wykład 5 Klasa Vec i jej operatory 1.Kategorie operatorów 2.Operatory ogólne - przykłady 3.Operatory specjalne [ ], ( ) oraz –> 4.Operatory new i delete.
Wykład 8 Polimorfizm 1.Funkcje polimorficzne 2.Czyste funkcje wirtualne i klasy abstrakcyjne PO8-1 / 38.
Seminarium Dyplomowe: Metodyka i Techniki Programowania Autor: Bartłomiej Fornal.
Podstawy informatyki Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Funkcje Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego Matuszyka Podstawy.
Podstawy informatyki Struktury Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi.
Podstawy informatyki Mechanizm obsługi sytuacji wyjątkowych Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
C++ mgr inż. Tomasz Turba Politechnika Opolska 2016.
Programowanie Obiektowe – Wykład 6
Dzisiejsze zajęcia będą wyjątkowe…
Kurs języka C++ – wykład 3 ( )
(według:
Programowanie Obiektowe – Wykład 2
Kurs języka C++ – wykład 4 ( )
Język C++ Typy Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Język C++ Tablice Łukasz Sztangret Katedra Informatyki Stosowanej i Modelowania Prezentacja przygotowana w oparciu o materiały Danuty Szeligi i Pawła Jerzego.
Zapis prezentacji:

PO13-1 / 19 Wykład 13 Wyjątki i ich zgłaszanie Wyłapywanie wyjątków Obsługa wyjątków Wykorzystanie polimorfizmu Filtrowanie wyjątków Błędy w konstruktorach Obsługa wyjątków

Wyjątki Wyjątek – nietypowa sytuacja Kod, który napotka błąd, zgłasza wyjątek i tym samym powoduje wyjście z funkcji. Wyjątek jest wyłapywany w funkcji nadrzędnej, czyli tej, która wywołała funkcję, w której wyjątek zgłoszono PO13-2 / 19

Zgłoszenie wyjątku throw konstruktor_klasy_wyjątku(... ); throw exception( ); // wyjątek dowolny throw runtime_error("Dowolny tekst" ); throw bad_alloc("Dowolny tekst" ); throw range_error("Dowolny tekst" ); throw overflow_error("Dowolny tekst" ); Przykłady: Wskazanie na ten tekst daje funkcja what( ) wywołana do utworzonego obiektu klasy wyjątku. Klasy runtime_error, bad_alloc, runge_error, overflow_error pochodzą (bezpośrednio lub pośrednio) od klasy exception i ich konstruktory wymagają podania tekstu w argumencie. PO13-3 / 19

Klasy pochodne od exception exception logic_error bad_alloc runtime_error oveflow_error bad_cast bad_exception ios_base_failure bad_typeid underflow_error range_error length_error invalid_argument domain_error out_of_range PO13-4 / 19

Wyłapywanie wyjątków catch ( const typ_wyjątku zmienna ) { // instrukcje funkcji } catch ( const exception &e ) // dowolny wyjątek bazujący { // na klasie exception cerr << "Przechwycono wyjątek" << endl; exit(1); } Przykłady: Może to być przekazanie: wartości, referencji lub wskaźnika Funkcja wyłapująca wyjątki PO13-5 / 19

Przykłady funkcji catch ( const runtime_error &e ) // wyjątek bazujący na klasie runtime_error { // cerr << "Wyjątek: " << e.what( ) << endl; } Tekst przekazany konstruktorowi w instrukcji throw runtime_error oveflow_error underflow_error range_error PO13-6 / 19

Przykłady funkcji catch (... ); // wyjątek dowolnego typu – mogą to też być // typy: int, char*, itp. { // cerr << "Wyjątek dowolnego typu " << endl; } Przechwytywanie wyjątków dowolnego typu Wyjątki przechwytywane są w kolejności występowania ich typów w funkcjach catch. Powyższa funkcja musi wyłapywać wyjątki jako ostatnia, ponieważ nie pozostawia ona już żadnych wyjątków do wyłapania. PO13-7 / 19

Przykład nieprawidłowy catch ( const runtime_error &e ) { // obsługa wszystkich wyjątków // runtime_error } catch ( const overflow_error &e ) { // obsługa wyjątków // overflow_error } runtime_error oveflow_error underflow_error range_error Wyjątki klasy overflow_error zostały już wyłapane jako wyjątki bazujące na klasie runtime_error PO13-8 / 19

Przykład prawidłowy catch ( const overflow_error &e ) { // obsługa wyjątków // overflow_error } catch ( const runtime_error &e ) { // obsługa pozostałych wyjątków // runtime_error } runtime_error oveflow_error underflow_error range_error D wyłapania pozostały wyjątki klas: - range_error - underflow_error PO13-9 / 19

Obsługa try - catch try { // ciąg instrukcji, które mogą zgłosić wyjątki } catch ( /*parametr*/ ) { //... } catch ( /*parametr*/ ) { //... } //... catch ( /*parametr*/ ) { //... } Jedna lub kilka funkcji wyłapujących wyjątki w zaplanowanej kolejności PO13-10 / 19

int main( ) { try { cout << Podziel( 2.5, 0.5 ) << endl; cout << Podziel( 2.5, 0) << endl; } catch ( exception &e ) { cerr << e.what( ) << endl; } //... Przykład try - catch #include 5 Dzielenie przez zero! double Podziel( double x, double y ) { if(y==0) throw exception("Dzielenie przez zero!"); return x/y; } std::runtime_error("Dzielenie przez zero!"); std::runtime_error &e ) { PO13-11 / 19

Przykład 2 void CzytajVec( char *plik, Vec &v ) { ifstream we(plik, ios::in|ios::nocreate); if(we==0) {string t="Brak pliku"+plik; throw invalid_argument( t ); } we >> v; if(we==0) {string t="Złe dane w pliku"+plik; we.clear( ); throw runtime_error( t ); } PO13-12 / 19

Przykład 2 c.d. int main( ) { Vec W; try{ CzytajVec( "Dane.txt", W ); } catch ( invalid_argument &e ) { cerr << e.what( ) << endl; } catch ( runtime_error &e ) { cerr << e.what( ) << endl; } //... } PO13-13 / 19

Przykład 2 c.d. int main( ) { Vec W; try{ CzytajVec( "Dane.txt", W ); } catch ( exception &e ) { cerr << e.what( ) << endl; } //... } Klasa bazowa obu wyjątków Wywołanie funkcji polimorficznej PO13-14 / 19

Filtrowanie wyjątków void CzytajVec( char *plik, Vec &v ) throw (invalid_argument, runtime_error ) { ifstream we(plik, ios::in|ios::nocreate); if(we==0) {string t="Brak pliku"+plik; we.clear( ); throw invalid_argument( t ); } we >> v; if(we==0) {string t="Złe dane w pliku"+plik; we.clear( ); throw runtime_error( t ); } if(v==0) {throw logic_error( "Zerowy wektor" ); } PO13-15 / 19 Ten wyjątek nie może być zgłoszony. Przerywa wykonanie funkcji CzytajVec i wywołuje funkcję unexpected

Filtrowanie c.d. void CzytajVec( char *plik, Vec &v ) throw ( ) { ifstream we(plik, ios::in|ios::nocreate); if(we==0) {string t="Brak pliku"+plik; we.clear( ); throw invalid_argument( t ); } we >> v; if(we==0) {string t="Złe dane w pliku"+plik; we.clear( ); throw runtime_error( t ); } if(v==0) {throw logic_error( "Zerowy wektor" ); } Te wyjątki nie mogą być zgłoszone. Przerywają wykonanie funkcji CzytajVec i wywołują funkcję unexpected Lista jest pusta. Funkcja nie może zgłaszać żadnych wyjątków. PO13-16 / 19

Błędy w konstruktorach Jeśli wyjątek opuści konstruktor, obiekt nie został poprawnie utworzony i nie zadziała jego destruktor. Destruktory podobiektów zadziałają. Przed zgłoszeniem wyjątku należy „wyczyścić” obiekt, to znaczy wykonać to, co powinien zrobić destruktor - np. zwolnić zaalokowane pamięci. PO13-17 / 19

Przykład Prześledźmy przykładowy konstruktor klasy Tab2, której obiekty dysponują zaalokowaną pamięcią na tablice 2-indeksowe. Niech definicja klasy zawiera: class Tab2{ protected: int W, K;// liczba kolumn i wierszy double **A;// wskaźnik na tablicę //... public: Tab2( int, int ) ; // przykładowy konstruktor //... }; PO13-18 / 19

Przykład c.d. Tab2::Tab2( int W, int K ) throw(bad_alloc) : W(W), K(K) {// W i K to liczba wierszy i kolumn int i=0; try { A = new double*[W+1];// tablica wskaźników for( ; i<W; ++i ) A[i] = new double[K]; // alokacja wierszy } catch(... ) { // wyłapanie dowolnego wyjątku for( int j=0; j<i; ++j ) delete[ ] A[ j ]; delete[ ] A; throw bad_alloc("Brak pamięci!"); } // zgłoszenie wyjątku A[ W ]=0; } PO13-19 / 19