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

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

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

Identyfikacje typu na etapie. wykonania (RTTI)

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

Funkcje przeciążone, konstruktory kopiujące, argumenty domyślne

Wyjątki (exceptions)

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

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

Przeciążenie operatorów

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

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

Wyjątki. Wyjątki. 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

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

Podczas dziedziczenia obiekt klasy pochodnej może być wskazywany przez wskaźnik typu klasy bazowej.

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

Tbli Tablice obiektów biktó są tworzone dokładnie d tak samo, jak i tablice, składające się z elementów innego typu

Wstęp do programowania

#include "stdafx.h" #include <iostream> #include "windows.h" using namespace std;

Język C++ wykład VIII

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

Dziedziczenie. Ogólna postać dziedziczenia klas:

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

Efekty uboczne błędów

Programowanie obiektowe w języku C++ dr inż. Jarosław Forenc

Programowanie obiektowe w C++ Wykład 12

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

I - Microsoft Visual Studio C++

Zwracanie obiektu. Funkcja może zwracać obiekty: #include"stdafx.h #include <iostream> using namespace std; class samp { inti; public:

Część 4 życie programu

Wykład 5: Klasy cz. 3

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) { zdefiniuje. Integer::operator=(ri);

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

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

Automatyczne tworzenie operatora = Integer2& operator=(const Integer& prawy) {

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

Rzutowanie i konwersje

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

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

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

Wykład 8: klasy cz. 4

Język C++ zajęcia nr 2

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Techniki Programowania wskaźniki

Podstawy Programowania Obiektowego

Funkcje wirtualne. Wskaźniki do klas pochodnych są podstawą dla funkcji wirtualnych i polimorfizmu dynamicznego.

Projektowanie klas c.d. Projektowanie klas przykład

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

Programowanie Obiektowo Zorientowane w języku C++ Klasy, pola, metody

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.

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

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

Programowanie w języku C++

Programowanie w języku C++

Szablony klas, zastosowanie szablonów w programach

Wstęp do programowania

C++11. C++ 11 wybrane elementy. C++11: referencje do rvalue C++ 11: C++11: referencje do rvalue. C++11: referencje do rvalue. Referencje do rvalue

TEMAT : KLASY DZIEDZICZENIE

referencje Wykład 2. Programowanie (język C++) Referencje (1) int Num = 50; zdefiniowano zmienną Num (typu int) nadając jej wartość początkową 50.

Plik klasy. h deklaracje klas

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

it = 0; memset((void *)ptr, 0, items*sizeof(double)); cout << "Konstruktor sparametryzowany " << title << " adres: " << ptr << "\n";

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Struktura programu. Projekty złożone składają się zwykłe z różnych plików. Zawartość każdego pliku programista wyznacza zgodnie z jego przeznaczeniem.

Przekazywanie argumentów wskaźniki

Rozdział 4 KLASY, OBIEKTY, METODY

PARADYGMATY PROGRAMOWANIA Wykład 4

C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy. C++ - klasy INNE SPOSOBY INICJALIZACJI SKŁADOWYCH OBIEKTU

Functionalization. Funkcje w C. Marcin Makowski. 30 listopada Zak lad Chemii Teoretycznej UJ

Laboratorium nr 10. Temat: Funkcje cz.2.

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

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

TEMAT : KLASY POLIMORFIZM

Do czego służą klasy?

Tablice (jedno i wielowymiarowe), łańcuchy znaków

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

Informatyka. Wy-08 Klasy. mgr inż. Krzysztof Kołodziejczyk

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

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

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

Wykład 4: Klasy i Metody

Wstęp do Programowania 2

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

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

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

Obszar statyczny dane dostępne w dowolnym momencie podczas pracy programu (wprowadzone słowem kluczowym static),

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

Wskaźniki. nie są konieczne, ale dają językowi siłę i elastyczność są języki w których nie używa się wskaźników typ wskaźnikowy typ pochodny:

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

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

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

Przeciążenie (przeładowanie nazw) funkcji

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

Programowanie obiektowe - Przykładowe zadania egzaminacyjne (2005/2006)

Mechanizm dziedziczenia

Podstawy programowania. Wykład: 7. Funkcje Przekazywanie argumentów do funkcji. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Aplikacje w środowisku Java

Transkrypt:

Obsługa wyjątków Pozwala zarządzać błędami wykonania w uporządkowany sposób. Umożliwia automatyczne wywołanie części kodu, funkcji, metod klas, który trzeba wykonać przy powstaniu błędów. try //blok try tu umieszczamy kontrolowaną część kodu catch(typ1 arg) //blok catch tu będzie przekazywane sterowanie przy powstaniu wyjątków //typu typ1 catch(typ2 arg) //blok catch tu będzie przekazywane sterowanie przy powstaniu wyjątków //typu typ2 1

catch(typn arg) //blok catch tu będzie przekazywane sterowanie przy powstaniu wyjątków //typu typn W bloku try umieszczamy kod, który chcemy kontrolować pod kątem wystąpienia wyjątków. Przy powstaniu błędu dla generowania wyjątku używamy kluczowe słowo throw wyjątek Tu wyjątek to obiekt typu typk. Jeśli taki wyjątek pozostanie wygenerowany, sterowanie będzie przekazane odpowiedniemu blokowi catch(typk arg). Blok try może być bardzo krótki, a może obejmować cały program. O to, który blok catch przechwyci wyjątek, decyduje typ wyjątku, który ustawiamy słowem kluczowym throw. Przechwycony może być dowolny typ danych. To mogą być klasę, stworzone przez programistę. Jeśli w bloku try żaden wyjątek nie pozostanie wygenerowany, żaden blok catch nie dostanie sterowania. 2

Jeśli zostanie wygenerowany wyjątek, nie zadeklarowany w żadnym bloku catch, wykonanie programu będzie przerwane przez wywołanie funkcji z biblioteki run time C++ o nazwie terminate(). Przykład W17_0 Zazwyczaj kod, umieszczony w bloku catch, próbuje poprawić sytuację. Przecież istnieją takie przypadki, kiedy sytuację nie da się poprawić. Wtedy wywołujemy exit( ), terminate(), abort(). 3

start try To jest wyjatek typu MyExcept 100 Для продолжения нажмите любую клавишу... 4

Wyjątek typu klasy przyłkad W17_1 Wielu instrukcji catch przykład W17_2; W16!!! Jeśli funkcja jest włożona w blok try, można ograniczyć typy wyjątków, które funkcja może generować: zwrac_typ nazwa_funkcji(lista_argumentów) throw (lista_typów). int fun() throw(int, double, CExcpt) Funkcje generuje wyjątki tylko typów, oznaczonych na liście typów (na przykład, int, double, CExcpt) Microsoft Visual Studio C++ nie wspiera obsługi klauzuli throw(). Przechwytywanie wyjątków wszystkich typów: catch( ) // 5

Ponowne zgłoszenie wyjątku: przykład W17_3 Funkcje void terminate() Jest wywoływana podsystemom obsługi wyjątków, jeśli nie udało się znaleźć instrukcji catch dla zgłoszonego typu wyjątku. Domyślnie terminate() wywołuje abort(). Można zmienić to: o Piszemy swoją własną funkcje void my_handler() //swój własny sposób przerywania wykonania //ta funkcje musi tylko przerwać wykonanie programu! o Wywolujemy terminate_handler set_terminate(terminate_handler my_handler) throw() Tu: my_handler wskaźnik do funkcji my_handler; set_handler zwraca wskaźnik do starej procedury obsługi terminate(). Nagłówek <exception> 6

Funkcje unexpected() jest wywoływana, gdy funkcja próbuje zwrócić wyjątek, nie zadeklarowany na liście klauzuli throw. Domyślnie unexpected() wywołuje terminate(). To można zmienić: o Piszemy swój własny wariant obsługi void my_unexpected() //zgłoszenie wyjątku, zakończenie działania programy [ terminate() ] o Wywołujemy unexpected_handler set_unexpected(unexpected_handler my_unexpected) throw() Tu my_unexpected wskaźnik do funkcji, set_unexpected( ) zwraca wskaźnik do poprzedniej procedury unexpected(). Typy terminate_handler i unexpected_handler pozostały zdefiniowane jako typedef void ( *terminate_handler )( ); typedef void (*unexpected_handler)( ); Procedury my_unexpected(), my_terminate() nie powinni zwracać sterowanie kodu, który ich wywołuje powinni skończyć wykonanie programu 7

class my_class static int i; //. Statyczne dane składowe Powstaje tylko jedna kopia zmiennej, która będzie współdzielona pomiędzy wszystkimi obiektami tej klasy, a również klasami, pochodnymi od tej klasy. Każda zmienna statyczna jest faktycznie zmienną globalną, zasiąg deklaracji której jest ograniczony klasą, w którym ta zmienna pozostała zadeklarowana. To oznacza, że definicje tej zmiennej (wydzielenie pamięci) tworzy się nie w trakcie deklarowania jej w klasie, a w innym miejscu programy poza klasą. Jest możliwe jej inicjowanie poza klasą (domyślnie 0), a również i dostęp do jej poza klasą. Czas życia każdej zmiennej statycznej składowej klasy od początku wykonania programu (wcześniej od tworzenia samej klasy, do którego ta zmienna należy) i do zakończenia programy (obiekt klasy już jest zniszczony, a zmienna statyczna nie). 8

Główny sens użycia zmiennych statycznych danych klasy uniknięcie zmiennych globalnych (alternatywa namespace), komunikacje pomiędzy różnymi obiektami tej samej klasy. Przykład W18_0 Składowe klasy funkcje statyczne. Są używane dość rzadko, dla tego nie będziemy rozważali ich w obrębie tego kursu. Deklaracja danych const and volatile Kluczowe słowo const oznacza że obiekt lub zmienna nie ulegają modyfikacji: const declaration ; member-function const ; (const int i;) Kluczowe słowo volatile oznacza, że obiekt lub zmienna mogą być modyfikowane nie tylko instrukcjami kodu danego programu, a i systemem operacyjnym, sprzętem lub równoległe działającym wątkiem. 9

Zmienne volatile nie ulegają optymalizacji przy kompilacji dla tego że ich wartość w każdej chwili może być zmienioną. Wskaźniki const, volatile: Kluczowe słowo const ustala że wskaźnik po inicjowaniu nie może być zmieniony. Wskaźnik const jest chroniony przed modyfikacją. Kluczowe słowo volatile ustala że wartość, związana z nazwą, może być zmieniona nie tylko instrukcjami kody tego procesu, a i innego. To jest korzystne dla aplikacji z pamięcią wspólną. Deklarowanie obiektu, do którego wskazuje wskaźnik: const char *cpch; //elementy tablicy nie są modyfikowane volatile char *vpch; //elementy tablicy mogą być modyfikowane jako volatile Deklarowanie wartości wskaźnika: char * const pchc; //nie możemy zmienić wartość wskaźnik (adres) char * volatile pchv; //adres (wartość wskaźnika) jest zmienną typu volatile 10

int _tmain(int argc, _TCHAR* argv[]) double aa[] = 1.1, 2.2, 3.3 ; const double *p_a = const_cast<const double *>(aa); //*p_a = -1.0; //error C3892: 'p_a': you cannot assign to a variable that is const p_a ++; //OK cout << *p_a << endl; double * const pp_aa = const_cast<double * const>(aa); *pp_aa = -1.0; //OK //pp_aa++; // error C3892: 'pp_aa': you cannot assign to a variable that is const cout << aa[0] << " " << aa[1] << " " << aa[2] << endl; system("pause"); return 0; 2.2-1 2.2 3.3 Для продолжения нажмите любую клавишу... 11

Funkcje składowe const, mutable Funkcje składowe mogą być zadeklarowane jako const, co sprawia, że this jest traktowany jako wskaźnik const takie funkcje nie mogą zmieniać wartości składowych klasy. 12

class my_cl int i; mutable int j; public: my_cl(int ii, int jj) : i(ii), j(jj) void f() const; ; void my_cl::f() const i = 10; //blad - funkcje f() jest const j = 20; //OK, int j jest mutable Funkcje składowe klasy można deklarować jako volatile wskaźnik this jest traktowany jako volatile class A public: ; void f2(int a) volatile; Konstruktory, zadeklarowane jako explicit - 13

class my_cl int i; public: my_cl(int ii) i = ii; ; int main() my_cl ob(10); //to jest standardowa instrukcja - argument 10 będzie przekazany / //konstruktorowi klasy.. my_cl obb = 12; //to będzie przekonwertowane automatycznie do my_cl obb(12); Jeśli konstruktor klasy ma tylko jeden argument, można użyć dowolną z dwóch postaci inicjowania obiektu. Druga postać inicjowania polega na tym, że nadaje możliwość niejawnego konwertowania typu argumentu do typu klasy. Zastosowanie specyfikatora explicit wzbrania niejawną konwertowanie, czyli dla konstruktorów, które mają tylko jeden argument, pozostaje tylko jedna postać inicjowania 14

class my_cl int i; public: explicit my_cl(int ii) i = ii; ; int main() my_cl ob(10); //teraz tylko taka postać inicjowania jest możliwa Funkcje konwertujące. Czasami powstaje konieczność użycia obiektu klasy jednego typu w wyrażeniach, wymagających innego typu danych. Jednym ze sposobów takiego przetwarzania jest napisanie funkcji konwertujących: operator typ() return wartość; typ to jest typ docelowy, wartość wartość klasy po konwersji. Funkcje konwertujące zwracają wartość typu typ. Funkcja konwertująca nie zawiera parametrów i musi być składową klasy. Przykład: 15

#include <iostream> using namespace std; class my_coord int x, y; public: my_coord(int xx, int yy) : x(xx), y(yy) operator int() return x*y; //funkcje konwertujece ; int _tmain(int argc, _TCHAR* argv[]) my_coord a(2, 3); int k; k = a; cout << "k = " << k << endl; k = 200 + a; cout << "k = " << k << endl; system("pause"); return 0; k = 6 k = 206 Для продолжения нажмите любую клавишу... 16