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

Podobne dokumenty
Wyjątki (exceptions)

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

Zaawansowane programowanie w C++ (PCP)

Programowanie Obiektowe Ćwiczenie 4

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

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

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

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

Identyfikacje typu na etapie. wykonania (RTTI)

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

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

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

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

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

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

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

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

Szablony funkcji i szablony klas

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

Projektowanie klas c.d. Projektowanie klas przykład

Programowanie obiektowe, wykład nr 7. Przegląd typów strukturalnych - klasy i obiekty - c.d.

Programowanie obiektowe

Wstęp do Programowania, laboratorium 02

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

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

EGZAMIN PROGRAMOWANIE II (10 czerwca 2010) pytania i odpowiedzi

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

Wykład 2 Wybrane konstrukcje obiektowych języków programowania (1)

Część 4 życie programu

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

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

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

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

Język C++ wykład VIII

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

Aplikacje w środowisku Java

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

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

DYNAMICZNE PRZYDZIELANIE PAMIECI

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

Oprogramowanie i wykorzystanie stacji roboczych. Wykład 4

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

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

Programowanie obiektowe

I - Microsoft Visual Studio C++

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

Zaawansowane techniki programowania C#

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

Platformy Programistyczne Wykład z Javy dla zaawansowanych

Szablony klas, zastosowanie szablonów w programach

PARADYGMATY PROGRAMOWANIA Wykład 4

Podstawy i języki programowania

Podstawy programowania w języku C++

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

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

C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie. C++ - dziedziczenie C++ - DZIEDZICZENIE.

Klasy cd. Struktury Interfejsy Wyjątki

Dawid Gierszewski Adam Hanasko

Programowanie obiektowe, wykład nr 6. Klasy i obiekty

TEMAT : KLASY DZIEDZICZENIE

Wykład 4: Klasy i Metody

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

Podstawy programowania obiektowego

Wprowadzenie do szablonów szablony funkcji

Swift (pol. jerzyk) nowy język programowania zaprezentowany latem 2014 r. (prace od 2010 r.)

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

Język ludzki kod maszynowy

Zaawansowane programowanie w C++ (PCP)

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

Wskaźniki. Informatyka

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ść

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

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

Wprowadzenie do szablonów szablony funkcji

C++ wprowadzanie zmiennych

Programowanie obiektowe. Materiały przygotował: mgr inż. Wojciech Frohmberg

Programowanie obiektowe

Ściąga z JTP. (Ja Tjeba Pierd...) Uwagi, nowe pytania, poprawki itd. zgłaszać na forum mambo.

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

Java SE Laboratorium nr 4. Temat: Obsługa wyjątków i zdarzeń

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

Proxy (pełnomocnik) Cel: Zastosowanie: Dostarczyć zamiennik pewnego obiektu, pozwalający kontrolować dostęp do niego.

Języki i metody programowania Java. Wykład 2 (część 2)

Języki i techniki programowania Ćwiczenia 2

Kurs programowania. Wykład 9. Wojciech Macyna

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

Obsługa błędów czyli jak sobie radzić z prawem Murphy ego

11.1 Obsługa błędów i wyjątków Polecenia try, throw, catch CLI C++, klasa Exception... 9

Dziedziczenie. dr Jarosław Skaruz

Java: kilka brakujących szczegółów i uniwersalna nadklasa Object

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Konwencje obsługi błędów

Programowanie w C++ Wykład 5. Katarzyna Grzelak. 16 kwietnia K.Grzelak (Wykład 1) Programowanie w C++ 1 / 27

Efekty uboczne błędów

// Liczy srednie w wierszach i kolumnach tablicy "dwuwymiarowej" // Elementy tablicy są generowane losowo #include <stdio.h> #include <stdlib.

Wstęp do programowania

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

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

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

Transkrypt:

Dariusz Brzeziński Politechnika Poznańska, Instytut Informatyki

W językach niskopoziomowych błędy zgłaszane były przez zwracanie odpowiedniego statusu (liczby) W C main() zwraca int żeby można było określić czy aplikacja zakończyła się sukcesem (0) czy nie (!=0) Problemy Brak hieracrhii błędów Brak propagowania błędów Mieszanie logiki aplikacji z obsługą błędów 2

int main(int argc, const char* argv[]) { int status = processinput(); if (status!= 0){ return -1; result = calculateresult(); if (status < 0){ return -2; else { char* formattedresult; if (formatresult(result, formattedresult)) { return 0; else { return -3; 3

W nowszych językach wprowadzono wyjątki Wyjątek to dane o błędzie, które są automatycznie propagowane przez system uruchomieniowy Zalety Można tworzyć hierarchie błędów tworząc klasy Można je rzucać, czyli propagować w górę stosu wywołań Oddzielenie logiki aplikacji (try) od obsługi błędów (catch) 4

float squareroot( float num ) { float result = 0; if( num < 0 ) { throw std::string( "Błąd: liczba nie może być ujemna!" ); result = sqrt( num ); return result; 5

6

Praktycznie wszystkim 7

void dosomething() { class CustomException { throw 5; private: string message; int errorcode; bool fatal; void dosomething() { bool somevariable = false; throw somevariable; void dosomething() { throw CustomException( "An error occurred."); public: CustomException(string message); inline string getmessage() { return message; ; inline int geterrorcode() { return errorcode; ; inline bool isfatal() { return fatal; ; ; 8

class FileNotFoundException : public CustomException { private: std::string filename; public: FileNotFoundException( std::string filename ); inline std::string getfilename() { return filename; ; ; // Przesłonięcie metody getmessage() inline std::string getmessage() { std::stringstream ss; ss << "Nie znaleziono pliku: " << filename; return ss.str(); 9

Aby łapać wyjątki, kod, który rzuca wyjątek musi być otoczony klauzulą trycatch. Dodatkowo w klauzuli catch musi zostać podany typ odpowiadający typowi rzucanego wyjątku. try { std::cout << "Wywoływanie funkcji..." << std::endl; dosomething(); catch(customexception e) { std::cout << "Błąd: " << e.getmessage(); Wyjątek po rzuceniu trafia do bloku catch i może być odczytany przy pomocy zmiennej e typu CustomException. Dzięki tej zmiennej można odczytać wszystkie informacje zawarte w obiekcie wyjątku i wykonać odpowiedni kod obsługi błędu. 10

Kod z poprzedniego slajdu zadziała, ale ma pewną wadę. Za każdym razem, gdy występuje wyjątek łapiemy go przez wartość. Oznacza to, że przy każdym przekazaniu wyjątku w górę stosu tworzona jest jego kopia. Prowadzi to do zmniejszenia efektywności czasowej i pamięciowej kodu. By uniknąć tego problemu, lepiej łapać wyjątki przez referencję. try { std::cout << "Wywoływanie funkcji..." << std::endl; dosomething(); catch(customexception& e) { std::cout << "Błąd: " << e.getmessage(); 11

try { // FileNotFoundException jest podklasą CustomException throw FileNotFoundException("example.txt"); catch(customexception e) { std::cout << Błąd: " << e.getmessage(); Powyższy kod w założeniu powinien wypisać komunikat Błąd: nie znaleziono plik example.txt. Niestety, gdy obiekt podklasy jest kopiowany do obiektu klasy nadrzędnej to wszystkie atrybuty charakterystyczne dla klasy podrzędnej są tracone. 12

try{ dosomething(); catch( CustomException& ce ) { std::cout << "Błąd: " << ce.getmessage(); catch(...) { std::cout << "Nieznany błąd!"; Aby złapać wyjątek dowolnego typu należy skorzystać z bloku postaci catch(...). W takim bloku złapany zostanie dowolny wyjątek, lecz nie ma wówczas dostępu do jego atrybutów. 13

try{ dosomething(); catch(customexception& ce) { std::cout << "Błąd: " << ce.getmessage(); rethrow ce; catch(...) { std::cout << "Nieznany typ błędu!"; rethrow; 14

Słowo kluczowe throw w C++ ma dwa znaczenia. Oprócz rzucania wyjątku, pozwala ograniczyć typy rzucanych przez metodę wyjątków do zadanej listy. Ograniczenie to nie jest jednak wymuszane przez kompilator! void dosomething(int value) throw(int, CustomException) { if(value > 5) { throw CustomException( "Wystąpił błąd..." ); else { throw 18; 15

Biblioteka STL zawiera już klasę, która ma służyć jako bazowa dla rzucanych wyjątków oraz kilka klas z niej dziedziczących. try { std::cout << "Strumień wyjściowy może rzucić wyjątek..."; catch(std::exception& ex) { std::cerr << "Błąd: " << ex.what(); Wyjątek bad_alloc bad_cast bad_exception bad_typeid ios_base::failure Opis Rzucany przez operator new przy błędzie w trakcie alokacji pamięci Rzucany przez dynamic_cast przy nieudanej próbie rzutowania Rzucany, gdy wyjątek nie pasuje do żadnego bloku catch Rzucany przez typeid Rzucany przez metody strumieni we/wy 16

http://www.ozzu.com/cpp-tutorials/tutorial-exceptions-t86515.html http://www.cplusplus.com/doc/tutorial/exceptions/ http://en.wikipedia.org/wiki/exception_guarantees http://en.wikipedia.org/wiki/exception_safety http://www.cprogramming.com/tutorial/exceptions.html 17