Innehåll. Exceptionella händelser (exceptions, undantag ) Felhantering Tre nivåer av felhantering: Nivå 2: exceptions (eller returvärde)

Relevanta dokument
Innehåll. 1 Funktionsmalllar. 2 Klassmallar. struct Name { string s; //... }; const Name & minimum ( const Name & a, const Name & b) { if(a.s < b.

Innehåll. Resource handles. Resurshantering. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 7. Resurshantering, Felhantering

Innehåll. 1 Funktionsmallar. 2 Pekare och konstanter. 3 Typomvandlingar. struct Name { string s; //... };

Programmering i C++ EDA623 Mallar. EDA623 (Föreläsning 12) HT / 29

Innehåll. Parametriserade typer. Klassmallar. Klassmallen Vektor Konstructor med std::initializer_list. Klassmallen Vektor Medlemsfunktioner

Innehåll. 1 Kort om dynamisk polymorfism. 2 Arv i C++ 3 Multipelt arv. 4 Något om statisk polymorfism. class Container {

Innehåll. Pekaren this Självreferens. Klasser Resurshantering, representation. Överlagring av operatorer. Överlagring av operatorer

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (type casts) Explicita, namngivna typomvandlingar (C++-11)

Innehåll. Konstruktorer vid arv Regler för basklassens konstruktor. Konstruktorer vid arv. Konstruktorer vid arv. Konstruktorer vid arv

Programmering i C++ EDA623 Arv. EDA623 (Föreläsning 6) HT / 42

Tentamen EDAF30 Programmering i C++

Innehåll. Resurshantering. Resource handles. Minnesallokering. Minnesallokering Exempel: allokering på stacken. 6. Resurshantering

Innehåll. Typomvandlingar (casting) Implicita Typomvandlingar. Typomvandlingar (casting) Implicita Typomvandlingar

Innehåll. Pekare Exempel

Innehåll. Pekare Exempel

Innehåll. 1 volatile. 2 Kuriositeter. 3 Klasser och arv. 4 Råd och tumregler. 5 Mer om standard-containers. Trigraphs

Innehåll. Användardefinierade typer. Användardefinierade typer Kategorier. Konstruktorer. Konstruktorer Två sätt att skriva initiering av medlemmar

Innehåll. 1 Typdeklarationer och typomvandling 2 Resurshantering. 3 Objektorientering, kort repetition. 4 Klasser

Programmering i C++ EDA623 Objektorienterad programutveckling. EDA623 (Föreläsning 5) HT / 33

Tentamen EDAF30 Programmering i C++

2D1387, Programsystemkonstruktion med C++ 01/02 1

Innehåll. Pekare. Datatyper Pekare, Arrayer och Referenser. Pekare Syntax. Pekare Syntax, operatorer. 4. Standard-containers. Pekare och arrayer

Kapitel 6 - Undantag

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs

Inlämningsuppgift, EDAF30, 2016

Introduktion till arv

Generiska konstruktioner. Kursbokens kapitel 13

Programsystemkonstruktion med C++: Övning 2. Karl Palmskog september 2010

C++ Objektorientering - Klasser. Eric Elfving

Programmering i C++ EDA623 Mer om klasser. EDA623 (Föreläsning 6) HT / 26

Innehåll. EDAf30: Programmering i C++, 7.5 hp. EDAf30: Programmering i C++, 7.5 hp Viktiga skillnader mot Java

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Torsdag 7 januari 2016, 14:00-18:00

Generell (template) programmering. Effektiv C++ Slutliga tips Genomgång av gammal tenta. Daniel Aarno Allt som fungerar som x ÄR x

Operatoröverlagring. endast operatorsymboler definierade i C++ kan överlagras = += -= *= /= %= ^= &= = <<= >>= < > <= >= ==!= && > ->*, [ ] ( )

Del3 Klassanvändning, operatorer och pekare Ämnesområden denna föreläsning:

*:85/ID200V C++ HT07. Föreläsning 8 Medlemspekare Undantagshantering Namnrymder

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

TDDC76 - Programmering och Datastrukturer

Inlämningsuppgift, EDAF30, 2018

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

TDIU20 - Objektorienterad programmering i c++ - föreläsning 4

7 Templates och Exceptions

Innehåll. Introduktion till objektorientering. OOP (objektorienterad programmering) Objekt, instanser, klasser

Tentamen EDAF30 Programmering i C++

Dynamisk bindning och polymorfism

Det finns många flaggor till g++,

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Innehåll. Klasserna vector och deque

TDDC76 - Programmering och Datastrukturer

Objektorienterad Programkonstruktion. Föreläsning 4 8 nov 2016

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

C++ Objektorientering - Klasser. Eric Elfving Institutionen för datavetenskap

Repetition av OOP- och Javabegrepp

TDDE10 m.fl. Objektorienterad programmering i Java Föreläsning 6 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Repetition av OOP- och Javabegrepp

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Tommy Färnqvist, IDA, Linköpings universitet

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 In- och utmatning. 5 Operatoröverlagring. 6 namnrymder (namespace)

Innehåll. 1 Deklarationer, scope och livstid. 2 Användardefinierade typer. 4 Operatoröverlagring. 5 In- och utmatning. 6 namnrymder (namespace)

Användning av typeid. Operatorerna typeid och. Filen typeinfo.h måste inkluderas. typeid

Tillämpad programmering

TDDI14 Objektorienterad programmering

Outline. Objektorienterad Programmering (TDDC77) Att instansiera en klass. Objekt. Instansiering. Åtkomst. Abstrakt datatyp.

Objektorienterad programmering i Java Undantag Sven-Olof Nyström Uppsala Universitet Skansholm: Kapitel 11

Funktionens deklaration

Intro till standardbiblioteket. Eric Elfving

Innehåll. Pekare Syntax

Typkonvertering. Java versus C

TDIU01 Programmering i C++

Övriga byggstenar. Övriga byggstenar. Några tips under programutveckling. Beroenden Pekare till funktioner Typkonvertering

Tecken. char. char ch = A ; sizeof(char) = 1 byte (ej 16-bitars tecken som i Java) char namn[]= "Nils"; // längd = 5 bytes

I STONE. I Variabler, datatyper, typkonvertering. I Logiska och matematiska uttryck. I Metoder-returvärde och parametrar. I Villkorssatser if/else

2D1387, Programsystemkonstruktion med C++ Johnny Bigert, Kursens hemsida:

Classes och Interfaces, Objects och References, Initialization

TDIU20 - Objektorienterad programmering i c++ - föreläsning 3

Idag. Exempel, version 2. Exempel, version 3. Ett lite större exempel

Programsystem konstruktion med C++ (2D1387) Innehåll. övning 2 klasser och arv

Arrayer. results

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Programmering A. Johan Eliasson

Föreläsning 8 - del 2: Objektorienterad programmering - avancerat

DD2387 Programsystemkonstruktion med C++ Tentamen 2

TDIU01 - Programmering i C++, grundkurs

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Felsökning. Datatyper. Referenstyper. Metoder / funktioner

Objektorienterad Programmering (TDDC77)

Objektorienterad Programmering (TDDC77)

C++-programmets beståndsdelar

TDDC76 - Programmering och Datastrukturer

F4. programmeringsteknik och Matlab

Command line argumenter. Objektorienterad Programmering (TDDC77) Vad blir resultatet? Nu då? Ahmed Rezine. Hösttermin 2016

Objektorienterad programmering

Byggstenar. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Grundläggande datatyper

C++ - En introduktion

Transkript:

Innehåll EDAF30 Programmering i C++ 7. Felhantering. Sven Gestegård Robertz Datavetenskap, LTH 2017 1 Felhantering Exceptions Exceptions och resurshantering Specifikation av exceptionella händelser Static assert 2 7. Felhantering. 2/1 Felhantering Tre nivåer av felhantering: Exceptionella händelser (exceptions, undantag ) 1 Vidta lämplig åtgärd direkt för att möjliggöra fortsatt exekvering 2 Kategorisera och skicka vidare felet till någon annan programenhet, som förväntas hantera det 3 Identifiera felet, ge något felmeddelande samt låt därefter programmet krascha ( fail-fast, t ex assert) Nivå 2: exceptions (eller returvärde) Felhantering kan göras med throw och catch, (t.ex. vid indexering utanför gränser). Likt Java. Vid throw poppas aktiveringsposter från stacken tills en funktion som innehåller ett matchande catch hittas. Om ett exception inte fångas kommer programmet att krascha. (Programmet avslutas genom att terminate() anropas.) Standardklasser för exceptions: #include <stdexcept> Felhantering : Exceptions 7. Felhantering. 3/33 Felhantering : Exceptions 7. Felhantering. 4/33 Standardbibliotekets exception-klasser Felhantering Klassträd för klasserna i <stdexcept> length error invalid argument logic error out of range exception domain error range error runtime error overflow error // Programkod där fel kan uppst å catch ( parameter av någon typ) // Kod som tar hand om denna typ av fel catch ( parameter av någon typ) // Kod som tar hand om denna typ av fel catch (...) // Kod som tar hand om resten ( default ) Den första catch-sats som matchar typen väljs. Fånga subklasser före superklassen. underflow error Felhantering : Exceptions 7. Felhantering. 5/33 Felhantering : 7. Felhantering. 6/33

Exempel: cout << " Ange ett tal : "; int i; if ( cin >> i) int r = f(i); cout << " Resultat : " << r << endl ; catch ( overflow_error ) cout << Resultat utanf ör giltigt omr åde ); catch ( exception & e) Exempel: cout << " Ange ett tal: "; int i; if (cin >> i) int r = f(i); cout << " Resultat : " << r << endl ; catch ( overflow_error &) cout << Resultat utanf ör giltigt område ); catch ( exception & e) Fördefinierad funktion i klassen exception Felhantering : 7. Felhantering. 7/33 Felhantering : 7. Felhantering. 7/33... och skicka vidare do_something (); catch length_error & le) // hantera length error catch out_of_range &) throw ; // skicka vidare catch (...) // default Syntax för throw throw std :: exceptionnamn ("Extra info "); Exempel: throw invalid_argument (" till f2"); Felhantering : 7. Felhantering. 8/33 Felhantering : 7. Felhantering. 9/33 Deklaration av egna undantag som subklasser # include <stdexcept > class communication_error : public runtime_error public : communication_error ( const string & mess = "") : runtime_error ( mess ) ; av egendeklararade undantag throw communication_error (" Checksum error "); Felhantering : 7. Felhantering. 10/33 Deklaration av helt egna undantag struct MyOwnException MyOwnException (const std :: string & msg, int val) : mmsg,vval std :: string m; int v; ; av egendeklararade undantag void f() throw MyOwnException ("An error occurred ", 17); void test1 () f(); catch ( MyOwnException &e) cout << " Exception : " << e.m << " - " << e.v << endl ; Felhantering : 7. Felhantering. 11/33

Resurshantering: destruktorer körs vid stack unwinding struct Foo int x; Foo ( int ix) :xix cout << " Foo (" <<x<<")\n"; ~ Foo () cout << "~ Foo (" <<x<<")\n"; ; void test (int i) Foo f(i); if(i == 0) throw std :: out_of_range ("noll?"); else Foo g (100+ i); test (i -1); cout << " after call to test (" << i -1 << ")\n"; int main () Foo f (42); Foo g (17); test (2); catch (std :: exception & e) cout <<e. what ()<< endl ; Foo (42) Foo (17) Foo (2) Foo (102) Foo (1) Foo (101) Foo (0) ~ Foo (0) ~ Foo (101) ~ Foo (1) ~ Foo (102) ~ Foo (2) ~ Foo (17) noll? ~ Foo (42) Felhantering : Exceptions och resurshantering 7. Felhantering. 12/33 Specifikation av exceptionella händelser i C++11 Nyckelordet noexcept anger om en funktion får lov att generera exceptions eller inte. Att inte ange något är samma som noexcept(false). I deklarationen av funktionen struct Foo void f(); void g() noexcept ; ; och i definitionen av funktionen # include <stdexcept > void Foo ::f() throw std :: runtime_error ("f failed "); void Foo ::g() noexcept throw std :: runtime_error ("g lied and failed "); Felhantering : Specifikation av exceptionella händelser 7. Felhantering. 13/33 Specifikation av exceptionella händelser Excempel på användning Specifikation av exceptionella händelser äldre C++, använd inte # include <typeinfo > // for typeid void test_noexcept () Foo f; f.f (); catch (std :: exception &e) f.g (); catch (std :: exception &e) cout << " done \n"; St13runtime_error : f failed terminate called after throwing an instance of std :: runtime_error what (): g lied and failed I äldre C++ fanns händelselistor för en funktion: typerna för de händelser som kan genereras av funktionen specificeras med nyckelordet throw. Exempel på händelselista: int f( int ) throw (typ1, typ2, typ3 ) throw typ1 ("Fel av typ 1 har intr ä ffat "); throw typ2 ("Fel av typ 2 har intr ä ffat "); throw typ3 ("Fel av typ 3 har intr ä ffat "); Ingen lista Alla typer av händelser kan genereras Tom lista (throw()) Inga händelser kan genereras Felhantering : Specifikation av exceptionella händelser 7. Felhantering. 14/33 Felhantering : Specifikation av exceptionella händelser 7. Felhantering. 15/33 Tumregler för exceptions Static assert Tänk på felhantering tidigt i designen Använd specifika exception-typer, inte inbyggda typer. (använd inte throw 17;, throw false;, etc. ) Throw by value, catch by reference Om en funktion inte ska kasta exceptions, deklarera noexcept. Specificera invarianter för dina typer Konstruktorn säkerställer invarianten, eller kastar ett exception. Medlemsfunktioner kan lita på invarianten. Medlemsfunktioner måste upprätthålla invarianten. Exempel: Vektor storleken ant är ett positivt heltal arrayen p pekar på är av storlek ant Om allokeringen av arrayen misslyckas kastas std::bad_alloc Om nånting kan kontrolleras vid kompilering, använd static_assert. Felhantering : Specifikation av exceptionella händelser 7. Felhantering. 16/33 constexpr int some_param = 10; int foo(int x) static_assert ( some_param > 100, " some_param too small "); return 2*x; int main () int x = foo (5); std :: cout << "x is " << x << std :: endl ; return 0; // error : static assertion failed : some_param too small Felhantering : Static assert 7. Felhantering. 17/33

Generisk programmering Templates (mallar) Använder typparametrar för att skriva mer generella klasser och funktioner Slipper manuellt skriva en ny klass/funtion för varje datatyp som ska hanteras statisk polymorfism En mall instansieras av kompilatorn för typer den används för varje instans är en separat klass/funktion vid kompilering: ingen kostnad vid exekvering Exempel: Vanliga minimifunktionen template < class T> const T& minimum ( const T& a, const T& b) if (a < b) return a; else return b; Kan instansieras för alla typer som har operatorn < 7. Felhantering. 18/33 7. Felhantering. 19/33 Överlagring med vanlig funktion Instansiering av funktionsmallar sker i vissa fall automatiskt t.ex. vid utskrift: double x = 7.0, y = 5.0; long m = 5, n = 7; cout << minimum (x, y) << endl ; cout << minimum (m, n) << endl ; // Blandat funkar inte ( ingen casting görs!) cout << minimum (m, y) << endl ; // För att forcera casting ger man typ - parametern explicit cout << minimum <double >(m, y) << endl ; En explicit instans av en funktionsmall är en vanlig funktion implicit typkonvertering av argument struct Name string s; ; Överlagring för Name& const Name & minimum ( const Name & a, const Name & b) if(a.s < b.s) return a; else return b; 7. Felhantering. 20/33 7. Felhantering. 21/33 Funktionsmall för minsta elementet i en array kan överlagras template < typename T> T& min_element (T a[], size_t n) cout << "[min_element <"<<typeid (T). name ()<<"[] >]\n"; size_t idx = 0; for ( size_t i = 1; i < n; ++i) if(a[i] < a[ idx ]) idx = i; return a[ idx ]; (kompilatorn härleder typparametern T) int a[] 3,5,7,6,8,5,2,4; Generalisering: överlagra min_element för fler datastrukturer int ma = min_element (a, sizeof (a)/ sizeof (int )); 7. Felhantering. 22/33 7. Felhantering. 23/33

Funktionsmall för minsta elementet i iterator-par Funktionsmall för minsta elementet i en vector<t> template <typename FwdIterator > ForwardIterator min_element ( FwdIterator start, FwdIterator end) if( start == end ) return end ; ForwardIterator res = start ; auto it = start ; while (++ it!= end ) if (* it < * res ) res = it; return res ; Standardalgoritmerna är templates int a[] 3,5,7,6,8,5,2,4; int ma2 = * min_element (begin (a), end (a )); int ma3 = * min_element (a+2,a +4); Detta är en version av std::min_element Parametriserad på element-typen för vector template < typename T> T& min_element (vector <T>& c) if(v. begin ()==v.end ()) throw std :: range_error ("empty vector "); return * min_element (v.begin (), v.end ()); vector <int > v3,5,7,6,8,5,2,4; int mv2 = min_element (v); vector <int > v3,5,7,6,8,5,2,4; int mv = * min_element (v.begin (), v.end ()); 7. Felhantering. 24/33 7. Felhantering. 25/33 Funktionsmall för minsta elementet i en container Variant som kan användas för en godtycklig klass som har begin() och end() har en typedef som definierar namnet value_type (detta uppfylls av alla standard-containers) template <class Container > typename Container :: value_type & min_element ( Container & c) if(c. begin ()==c. end ()) throw std :: range_error ("empty container "); return * min_element (c.begin (), c.end ()); Kan även deklareras med två typ-parametrar: template <typename Container, typename T = typename Container :: value_type > T& min_element ( Container & c) Funktionsmall för minsta elementet i en array Trick: värdeparameter för arrayens storlek, och inferens template < typename T, size_t N> T& min_element (T (&a)[n]) size_t idx = 0; for ( size_t i = 1; i < N; ++i) if(a[i] < a[idx ]) idx = i; return a[idx ]; int a[] 3,5,7,6,8,5,2,4; int ma4 = min_element (a); Här vet kompilatorn storleken på a[] och fyller i mall-parametern N 7. Felhantering. 26/33 7. Felhantering. 27/33 minsta elementet i nånting man kan iterera över int a[] 3,5,7,6,8,5,2,4; int & ma = min_element (a); vector <int > v3,5,7,6,8,5,2,4; int & mv = min_element (v); deque <int > dv. begin (), v. end (); int & md = min_element (d); string s" kontrabasfiol "; char & ms = min_element (s); std::min_element för typer som inte har < Överlagring med en template-parameter: LESS (en egenskapsklass) template <class IT, class LESS > IT min_element (IT first, IT last, LESS cmp ) IT m = first ; for (IT i = ++ first ; i!= last ; ++i) if (cmp (*i, *m)) m = i; return m; LESS måste ha operator() och typerna måste stämma, t ex: class Str_Less_Than public : bool operator () ( const char *s1, const char *s2) return strcmp (s1, s2) < 0; ; 7. Felhantering. 28/33 7. Felhantering. 29/33

std::min_element för typer som inte har < Nästa föreläsning Exempel på användning med stränglista: list < const char *> tl = " hej ", "du", " glade " ; Str_Less_Than lt; // funktionsobjekt Typomvandlingar. Klasser: Operatorer och arv cout << * min_element (tl.begin (), tl.end (), lt ); Str_Less_Than-objektet kan skapas direkt i parameterlistan: cout << * min_element (tl.begin (), tl.end (), Str_Less_Than ()); (C++11) lambda: anonymt funktions-objekt auto cf= []( const char * s, const char * t) return strcmp (s,t ) <0;; Referenser till relaterade avsnitt i Lippman Typomvandingar 4.11 Operatorer och typomvandling kapitel 14 Dynamisk poymorfism och arv kapitel 15 15.2.2 Pekaren this s. 257 260 cout << * min_element (tl.begin (), tl.end (), cf ); 7. Felhantering. 30/33 7. Felhantering. 31/33 Läsanvisningar Referenser till relaterade avsnitt i Lippman Exceptions 5.6, 18.1.1 16.1.1 7. Felhantering. 32/33