Programowanie w języku C++

Podobne dokumenty
Wyjątki (exceptions)

Programowanie w języku C++

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

Podstawy programowania w języku C++

Efekty uboczne błędów

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

Programowanie w języku C++

Podstawy programowania w języku C++

Język C++ wykład VIII

Wprowadzenie do programowanie obiektowego w języku C++

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

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

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

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

Podstawy programowania w języku C++

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

Podstawy programowania w języku C++

Podstawy programowania w języku C++

Wstęp do programowania

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

Podstawy programowania w języku C i C++

Klasyfikacja wyjątków

Podstawy programowania w języku C++

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

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

Programowanie Obiektowe Ćwiczenie 4

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

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

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

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

Wstęp do programowania

class Student Deklaracja klasy Osoba: Deklaracja klasy Student:

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Laboratorium 3. Instrukcje wyboru

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

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

Wprowadzenie do programowania w języku C

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

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

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

Podstawy programowania

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

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

Wprowadzenie do programowanie obiektowego w języku C++

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

Wstęp do Programowania 2

Programowanie obiektowe

Języki programowania. Przetwarzanie tablic znaków. Część druga. Autorzy Tomasz Xięski Roman Simiński

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

2.4 Dziedziczenie. 2.4 Dziedziczenie Przykłady programowania w C - kurs podstawowy

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

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

Wprowadzenie w dziedziczenie. Klasa D dziedziczy klasę B: Klasa B klasa bazowa (base class), klasa D klasa pochodna (derived class).

Mechanizm dziedziczenia

Programowanie Obiektowo Zorientowane w języku c++ Przestrzenie nazw

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

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

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

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

Programowanie obiektowe

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

Projektowanie klas c.d. Projektowanie klas przykład

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

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

Programowanie i struktury danych

Podstawy programowania w języku C++

Programowanie w C++ Wykład 3. Katarzyna Grzelak. 12 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 35

Podstawy programowania. Wykład: 5. Instrukcje sterujące c.d. Stałe, Typy zmiennych c.d. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Wprowadzenie do programowania w języku C

I - Microsoft Visual Studio C++

Mechanizm dziedziczenia

Język ludzki kod maszynowy

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

1. Które składowe klasa posiada zawsze, niezależnie od tego czy je zdefiniujemy, czy nie?

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

Szablony funkcji i szablony klas

Wstęp do programowania

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

Języki programowania. Tablice struktur, pliki struktur. Część ósma. Autorzy Tomasz Xięski Roman Simiński

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

Globalne / Lokalne. Wykład 15. Podstawy programowania (język C) Zmienne globalne / lokalne (1) Zmienne globalne / lokalne (2)

Strona główna. Strona tytułowa. Programowanie. Spis treści. Sobera Jolanta Strona 1 z 26. Powrót. Full Screen. Zamknij.

Ćwiczenia podstawowe, zestaw 5, część 1

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

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

Listy powiązane zorientowane obiektowo

Szablony klas, zastosowanie szablonów w programach

TEMAT : KLASY DZIEDZICZENIE

KLASA UCZEN Uczen imię, nazwisko, średnia konstruktor konstruktor Ustaw Wyswietl Lepszy Promowany

1 Definiowanie prostych klas

Plik klasy. h deklaracje klas

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.

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

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

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Wyjątki. Wyjątki. Wyjątki. Wyjątki. Wyjątki. Wyjątki

Programowanie - wykład 4

Transkrypt:

Programowanie w języku C++ Część szósta Autor Roman Simiński Kontakt siminski@us.edu.pl www.us.edu.pl/~siminski Niniejsze opracowanie zawiera skrót treści wykładu, lektura tych materiałów nie zastąpi uważnego w nim uczestnictwa. Opracowanie to jest chronione prawem autorskim. Wykorzystywanie jakiegokolwiek fragmentu w celach innych niż nauka własna jest nielegalne. Dystrybuowanie tego opracowania lub jakiejkolwiek jego części oraz wykorzystywanie zarobkowe bez zgody autora jest zabronione.

Wyjątki po co coś takiego? Błędy i ich obsługa W trakcie działania programu zawsze może dojść do powstania sytuacji nietypowej. Uniknąć się tego nie da. Można jednak przewidywać iż taka sytuacja wystąpi i się na nią przygotować. Drobiazgowe kontrolowanie poprawności wykonywanych operacji jest możliwa, jednak kompleksowa obsługa błędów jest uciążliwa. Przykład obsługi w C: if( ( file = fopen( name, "rt" ) ) == NULL ) return IN_FILE_ERROR; else if( ( num_of_lines = count_lines( file ) ) = 0 ) return EMPTY_IN_FILE; else if( ( lines = malloc( num_of_lines * sizeof( char ) ) ) == NULL ) return NO_MEM_ERROR; else if( ( buffer = malloc( MAX_LINE_LEN ) ) == NULL ) return NO_MEM_ERROR; else while( fgets( buffer, file, MAX_LINE_LEN )!= NULL )...... Copyright Roman Simiński Strona : 2

Wyjątki po co coś takiego? Błędy i ich obsługa,cd... Uciążliwość i powtarzalność sekwencji kontroli poprawności wykonywanych operacji, budzi ochotę do wyskakiwania z normalnego kodu instrukcją goto do fragmentu obsługi błędów.... A przecież użycie goto jest nieeleganckie :-/ W języku C przewidziano zestaw funkcji i makr do kontroli błędów i reagowania na ich powstanie: assert(), signal(), raise(), setjmp(), longjmp(). Są one jednak rzadko stosowane mało znane i wymagające uwagi. Użycie sygnałów i nielokalnych skoków jest niebezpieczne w C++, nie zapewnia bowiem właściwego aktywowania np. destruktorów. Copyright Roman Simiński Strona : 3

Wyjątki po co coś takiego? Błąd jako sytuacja wyjątkowa W języku C++ wprowadzono mechanizm pozwalający programiście na reagowanie na sytuacje błędne czy nietypowe. Gdy taka sytuacja wystąpi, programista może wygenerować wyjątek. Wyjątek (ang. exception) to obiekt pewnej klasy. Wygenerowanie wyjątku polega na przekazaniu obiektu pisującego wyjątek z fragmentu kodu, w którym wystąpił problem, do fragmentu, w którym przewidziano jego obsługę. Wygenerowanie (zgłoszenie) wyjątku powoduje przerwanie wykonywania sprawiającego problemy kodu i przejście do obsługi sytuacji problematycznej. Obsługa ta może znajdować się w innym miejscu kodu. Wyjątek jest obiektem, jego klasa określa typ sytuacji wyjątkowej. Obiekt może w sobie posiadać pola oraz funkcje składowe, pozwalające na sprecyzowanie informacji o zaistniałej sytuacji wyjątkowej. Copyright Roman Simiński Strona : 4

Wyjątki po co coś takiego? Przykład wykorzystania wyjątków Krok 1-szy zdefiniowanie klasy wyjątku: class Error ; Krok 2-gi zgłaszanie wyjątku: void allocitems() int numofitems; cin >> numofitems; if( numofitems <= 0 ) throw Error(); else //... Zgłoszenie wyjątku klasy Error Zgłoszenie (wygenerowanie) wyjątku instrukcja throw throw wyraż enie_pewnego_typu; Copyright Roman Simiński Strona : 5

Wyjątki po co coś takiego? Przykład wykorzystania wyjątków Krok 3-ci wywołanie funkcji generującej (zgłaszającej) wyjątek, kod wywołujący funkcję generującą wyjątek musi być napisany w specjalny sposób:... try allocitems(); catch( Error ) cout << "Blad";... Funkcja, która potencjalnie może wygenerować wyjątek, powinna być wywołana w obrębie bloku try. Obsługa wyjątków (ang. exception handler). Tutaj kierowane jest wykonanie programu po wygenerowaniu wyjątku instrukcją throw. Co się stanie, gdy wyjątek nie zostanie obsłużony? allocitems(); // Dalszy ciąg programu //... //... Jeżeli ta funkcja wygeneruje wyjątek, program zostanie awaryjnie zakończony, dalsza część programu się nie wykona. Copyright Roman Simiński Strona : 6

Ogólny schemat zgłaszania wyjątków Zgłaszanie wyjątków throw nieco dokładniej Wyjątki są generowane instrukcją throw. Po słowie kluczowym throw występuje dowolne wyrażenie pewnego typu. Wartość tego wyrażenia jest zgłaszana jako wyjątek. Wyjątki mogą być również typu wbudowanego: if( numofitems <= 0 ) throw 1; if( numofitems <= 0 ) throw "Ujemna liczba elementow";... try allocitems(); catch( int ) cout << "Wyjatek jako int";...... try allocitems(); catch( char const * ) cout << "Wyjatek jako char const *";... Tak zdefiniowana obsługa jest czuła na różne typy wyjątków. W obrębie danego typu wyjątku, różne jego wartości nie są rozróżniane. Copyright Roman Simiński Strona : 7

Ogólny schemat zgłaszania Co się dzieje po zgłoszeniu wyjątku? Gdy wyjątek zostanie wygenerowany instrukcją throw, biblioteka czasu wykonania (ang. RTL run time library): Pobiera wyjątek, określa jego typ. Przeszukuje stos wywołań funkcji w poszukiwaniu takiej, która zawiera obsługę wyjątku tego typu (czyli odpowiednią instrukcję catch). Jeżeli odpowiednia obsługa wyjątku zostanie znaleziona, stos jest w tym miejscu rozwijany (ang. unwind) i wyjątek jest obsługiwany. Jeżeli w trakcie tych poszukiwań nie został znaleziony pasujący blok obsługi wyjątku, dochodzimy do punktu wejściowego programu,czyli funkcji main. Jeżeli i tutaj nie ma obsługi zgłoszonego wyjątku, program jest przerywany w trybie awaryjnym. W trakcie przechodzenia do kolejnych bloków w stosie wywołań, usuwane są wszystkie obiekty automatyczne, czemu towarzyszy aktywowanie ich destruktorów. Copyright Roman Simiński Strona : 8

Ogólny schemat zgłaszania Co się dzieje po zgłoszeniu wyjątku? Propagacja wyjątku kończy się : jego obsługą w odpowiednim bloku catch, po czym wykonywane są kolejne instrukcje następujące po tym bloku, przerwaniem wykonania programu, gdy wyjątek nie został obsłużony. Proces obsługi wyjątku jest jednokierunkowy. W jego trakcie niszczone są obiekty automatyczne, a sterowanie nigdy nie wróci automatyczne do miejsca zgłoszenia wyjątku. Uwaga: W trakcie przechodzenia do kolejnych bloków w stosie wywołań, usuwane są wszystkie obiekty automatyczne, czemu towarzyszy aktywowanie ich destruktorów. Jeżeli w trakcie tego procesu, któryś z destruktorów zgłosi wyjątek i go nie obsłuży, następuje awaryjne przerwanie wykonania programu. Copyright Roman Simiński Strona : 9

Ogólny schemat zgłaszania W jaki sposób przerywane jest wykonanie programu? Jeżeli wyjątek nie zostanie obsłużony, wywoływana jest biblioteczna funkcja terminate(). Domyślnie funkcja ta wywołuje funkcję abort() pochodzącą z standardowej biblioteki C, identyfikowanej przez plik nagłówkowy stdlib.h. Funkcja abort()nie zapewnia aktywowania destruktorów dla obiektów globalnych i statycznych. Można zmienić działanie funkcji terminate()poprzez zainstalowanie własnej funkcji kończącej, służy do tego funkcja set_terminate(). Własna funkcja kończąca musi być bezargumentową funkcją o rezultacie typu void. Rezultatem wywołania funkcji set_terminate() jest wskaźnik na poprzednio zainstalowaną funkcję. Można zatem zapamiętać adres oryginalnej funkcji kończącej i przywrócić ją w razie konieczności. Copyright Roman Simiński Strona : 10

Ogólny schemat zgłaszania Jak zmienić domyślną funkcję kończącą? #include <exception> #include <iostream> using namespace std; void my_terminator() cout << "I'll be back!" << endl; updateerrorslog(); cin.get(); exit(0); Konieczne jest włączenie tego pliku nagłówkowego Własna funkcja kończąca // Ustaw now ą funkcj ę kończąc ą, zapamiętaj adres poprzedniej void ( *old_terminator )() = set_terminate( my_terminator ); void throwfun() throw 1; int main() throwfun(); return 0; Copyright Roman Simiński Strona : 11

Ogólny schemat zgłaszania Zgłoszenie pustego wyjątku Czasem w podczas obsługi wyjątku okazuje się, że jedyne co można zrobić to posprzątać po sobie i poprosić o to samo inne funkcje. W takim przypadku można wygenerować ponownie wyjątek, co spowoduje ponowne uruchomienie poszukiwania obsługi wyjątków w wyższych warstwach hierarchii wywołań. void a() try b(); catch( int ) cout << "catch w a" << endl; void b() try c(); catch( int ) cout << "catch w b" << endl; throw; void c() throw 1; int main() a(); return 0; Copyright Roman Simiński Strona : 12

Ogólny schemat obsługi wyjątków Wychwytywanie większej liczby rodzajów wyjątków Wyjątki mogą być różnych typów. Można zatem rozróżniać rodzaje zgłaszanych sytuacji wyjątkowych. class CriticalError // Definicja klasy wyjątku krytycznego ; class NormalError ; // Definicja klasy wyjątku zwykłego void allocitems() int numofitems; cin >> numofitems; if( numofitems <= 0 ) throw NormalError(); else //... throw CriticalError(); Wygenerowanie normalnego wyjątku niski priorytet Wygenerowanie krytycznego wyjątku wysoki priorytet Copyright Roman Simiński Strona : 13

Ogólny schemat obsługi wyjątków Wychwytywanie wszystkich wyjątków Czasem chcemy wyłapać jednorazowo wszystkie klasy wyjątków: int main() try allocitems(); catch( CriticalError ) cout << "Blad krytyczny"; catch( NormalError ) cout << "Wyjatek zwykly"; return 0; Wyłapanie krytycznego wyjątku Wyłapanie wyjątku o niższym priorytecie Copyright Roman Simiński Strona : 14

Ogólny schemat obsługi wyjątków Wychwytywanie większej liczby rodzajów wyjątków, cd... Wychwytywanie różnych klas wyjątków za jednym zamachem : try allocitems(); catch(... ) Wyłapanie wszystkich wyjątków cout << "Biore wszystkie wyjatki na siebie!!!"; Wychwytywanie wybranych wyjątków a reszta obsługa hurtowa : try allocitems(); catch( CriticalError ) cout << "Krytyczne lapiemy osobno"; catch(... ) cout << "Reszta hurtowo jak leci"; Wyłapanie wszystkich wyjątków, innych niż CriticalError Copyright Roman Simiński Strona : 15

Ogólny schemat obsługi wyjątków Nazwane wyjątki dane w wyjątkach Do tej pory rozróżniane były typy wyjątków. Inny typ wyjątku inna sytuacja wyjątkowa. Wyjątki to obiekty. Mogą posiadać pola, można je inicjować i odczytywać. W polach obiektu stanowiącego wyjątek można przechowywać informację o różnych przyczynach powstania wyjątku. Klasa wyjątku przechowującego kod błędu class Error public: enum CRITICAL, NORMAL ; Error( int code ) : errcode( code ) int getcode() const return errcode; private: int errcode; ; Copyright Roman Simiński Strona : 16

Ogólny schemat obsługi wyjątków Nazwane wyjątki dane w wyjątkach, cd... Generowanie wyjątku jednego typu ze zróżnicowaniem kodu pamiętanego w polu klasy void allocitems() int numofitems; cin >> numofitems; if( numofitems <= 0 ) throw Error( Error::NORMAL ); else //... throw Error( Error::CRITICAL ); Wygenerowanie normalnego wyjątku niski priorytet Wygenerowanie krytycznego wyjątku wysoki priorytet Copyright Roman Simiński Strona : 17

Ogólny schemat obsługi wyjątków Nazwane wyjątki dane w wyjątkach, cd... Wyłapywanie wyjątku i identyfikacja kodu błędu try allocitems(); catch( Error & error ) switch( error.getcode() ) case Error::CRITICAL: cout << "Blad krytyczny"; break; case Error::NORMAL : cout << "Zwykly blad"; break; Copyright Roman Simiński Strona : 18

Ogólny schemat obsługi wyjątków Nazwane wyjątki bardziej obiektowa wersja Identyfikację błędu można poddać hermetyzacji class Error public: enum CRITICAL, NORMAL ; Error( int code ) : errcode( code ) char * errorname(); private: int errcode; ; char * Error::errorName() switch( errcode ) case CRITICAL: return "Blad krytyczny"; case NORMAL : return "Zwykly blad"; default : return "Nieznany blad"; Copyright Roman Simiński Strona : 19

Ogólny schemat obsługi wyjątków Nazwane wyjątki bardziej obiektowa wersja Niech wyjątek sam powie, kim jest: try allocitems(); catch( Error & error ) cout << error.errorname(); Copyright Roman Simiński Strona : 20