Kapitel 6 - Undantag

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

Kapitel 3. Synlighet. Kapitel 3 - Klassanvändning, operatorer och pekare. Synlighet

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

Synlighet. Namespace Scope-operatorn Klasser Vänner

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

Det finns många flaggor till g++,

Dynamisk bindning och polymorfism

Innehåll. Pekare Exempel

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

Innehåll. Pekare Exempel

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

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

Klasser. Kapitel 2. Kapitel 2 - Klasser, medlemmar och arv. Klasser. Klasser Medlemmar Arv

Introduktion. Klasser. TDP004 Objektorienterad Programmering Fö 2 Objektorientering grunder

C++-programmets beståndsdelar

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

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

Felhantering TDDD78, TDDE30, 729A

allokeras på stacken dynamiskt new delete

Del2 Klasser, medlemmar och arv Ämnesområden denna föreläsning:

Minneshantering. Minneshantering. Minneshantering. Undvik pekare

Ett enkelt program i C++, hello.cpp. #include <iostream> int main() { std::cout << "Hello World\n"; return 0; } C++, Övning 1

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

C++ Objektorientering - Klasser. Eric Elfving

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

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

Tentamen EDAF30 Programmering i C++

TDDC76 - Programmering och Datastrukturer

Föreläsning 6: Metoder och fält (arrays)

Objektorientering - Arv och polymorfi. Eric Elfving Institutionen för datavetenskap

grundläggande C++, funktioner m.m.

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

Dynamiskt minne. Vad är dynamiskt minne Motivering Hur gör man i C Övningar

TDDC76 - Programmering och Datastrukturer

Minnestilldelning (allokering) och frigörande (avallokering) av minne

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

Föreläsning 2, vecka 8: Repetition

Tentamen EDAF30 Programmering i C++

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Tentamen EDAF30 Programmering i C++

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

Trädtraversering. Binärt träd. Trädtraversering djupet-först. Trädtraversering bredden-först

Tentamen i DD2387 Programsystemkonstruktion med C++

Programsystemkonstruktion med C++

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

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

Tommy Färnqvist, IDA, Linköpings universitet

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

TDDC76 - Programmering och Datastrukturer

int (*fp) (char, char*) //pekare till funktion som tar //argumenten (char, char*) och //returnerar int

Uppgiften är att beskriva en kvadrat i ett Java program. En första version av programmet skulle kunna se ut så här:

TENTAMEN CD5250. Objektorienterad programutveckling med C++, 5p. Datum: , Tid: 14:00-19:00

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

Objektorientering - Arv och polymorfi

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

SP:PROG3 HT12 Tenta

F8: Typkonvertering i C++

Tentamen i TDP004 Objektorienterad Programmering Lösningsförslag

Kapitel 1. C++-programmets beståndsdelar. C++-programmets beståndsdelar. Kapitel 1 grunderna i C++

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Introduktion till arv

TDIU01 Programmering i C++

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

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

1 Klasser och objektorientering Vad är objektorientering?

Kopiering av objekt i Java

Skapa, kopiera och destruera klassobjekt

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

Pekare och arrayer. Indexering och avreferering

TDDC76 Programmering och datastrukturer

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

Föreläsning 4. Klass. Klassdeklaration. Klasser Och Objekt

Kapitel 5. Strömmar. Utmatning

DD2387 Programsystemkonstruktion med C++ Tentamen 1 Tisdagen den 28 oktober 2014, 08:00-12:00

Länkade strukturer, parametriserade typer och undantag

1 Comparator & Comparable

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

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

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

Generiska konstruktioner. Kursbokens kapitel 13

*Pekarvärden *Pekarvariabler & *

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

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

Funktionspekare, inledning: funktionsanropsmekanismen. Anrop via pekare

Namn: Personnr: 1 2D1310 Programmeringsteknik i Java för B,V (1p) 13 januari 2001, kl Hjälpmedel: En Javabok. För betyget godkänt krävs at

5 Arv och dynamisk bindning FIGUR

Exceptions (undantag) Murach s: kap 7

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

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

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

Tentamen i Grundläggande Programvaruutveckling, TDA548

Del A (obligatorisk för alla)

Föreläsning 5-6 Innehåll

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

OOP Objekt-orienterad programmering

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

Kungliga Tekniska Högskolan Ämneskod 2D4134 Nada Tentamensdag maj - 19 Tentamen i Objektorientering och Java Skrivtid 5 h

Övning från förra gången: readword

Introduktion till Datalogi DD1339. Föreläsning 2 22 sept 2014

Transkript:

Kapitel 6 Undantag

Kapitel 6 - Undantag Undantag (exceptions), returvärden throw, try och catch new, bad_alloc, nothrow Undantag och std::auto_ptr throw() i funktionsdeklaration try som funktionskropp (function try)

Varför inte returvärden? Returvärden räcker inte alltid till då man ska signalera ett fel i en funktion Vissa typer, såsom int, saknar särskilt värde som kan symbolisera fel Dock har några returtyper speciella värden, t.ex. double har NaN (not a number), pekare har NULL Man kan tvingas returnera och hantera felvärden i många steg i anropshierarkin, vilket leder till mycket kod att underhålla

throw, try och catch Istället för att hantera fel med returvärden bör man använda undantag (exceptions) try before(); // before() körs throw "error!"; // kasta sträng after(); // after() körs ej catch(const char *s) // ta emot undantag std::cout << s << std::endl;

throw, try och catch Om man inte vet vilken typ av undantag som kastas kan man ta emot alla: try before(); // before() körs throw 7; // kasta heltal after(); // after() körs ej catch(const char *s) // ta emot sträng std::cout << s << std::endl; catch(...) // ta emot allt annat std::cout << "unknown exception" << std::endl;

Kastavidare-throw; Ibland vill man kasta vidare (rethrow) det undantag man fått: void foo() int *p = new int[100]; // dynamiskt minne... try throw 7; // något gick fel catch(...) // ta emot allt std::cout << "error" << std::endl; delete p; // städa throw; // kasta vidare delete p; // städa

Standardbiblioteket Undantag i standardbiblioteket new och bad_alloc, och returvärdet NULL

Undantag i standardbiblioteket Standarden definierar en undantagsklass exception som är bas till de undantag standardbiblioteket kastar: class std::exception public: exception() throw() exception(const exception &) throw() exception &operator=(const exception &) throw() virtual ~exception() throw() virtual const char* what() const throw() private:.. Använd #include <exception> för att få tillgång till exception

Undantag i standardbiblioteket #include <stdexcept> // out_of_range m.m. // #inkluderar <exception> try throw std::out_of_range("array index out of bounds"); throw std::invalid_argument("negative array size"); catch(std::exception &e) std::cout << e.what() << std::endl;

new kastar bad_alloc När new misslyckas med att allokera minne är normalbeteendet att kasta ett undantag std::bad_alloc (nedärvd från std::exception) Observera att new inte returnerar NULL om man inte anger det explicit med std::nothrow

new kastar bad_alloc #include <new> // innehåller bad_alloc try size_t n = 100000000; A *a = new A[n]; // slut på minne A *b = new (std::nothrow) A[n]; // null om fel catch(std::bad_alloc &e) std::cout << e.what() << std::endl; // felmeddelande

Undantag och auto_ptr Användbar teknik för att hantera dynamiskt minne: #include <memory> // smart pekare std::auto_ptr void foo() std::auto_ptr<a> p(new A); // dynamiskt minne try p->i = 5; // p härmar pekarsyntax... throw 7; // något gick fel catch(...) // ta emot allt std::cout << "error" << std::endl; throw; // kasta vidare

Undantag och auto_ptr auto_ptr har en destruktor som frigör minnet i det ägda objektet Detta oavsett hur man lämnar funktionen, via undantag, return eller "faller över kanten" Varning: använd inte auto_ptr med new[] eftersom den frigör minnet med delete! Det finns ingen klass för new[] i standardbiblioteket. Se dock Boosts scoped_array (www.boost.org)

Funktionsdeklarationer throw() Virtuella funktioner

Funktionsdeklarationer med throw() Man kan specificera de undantag som en funktion kan kasta genom att ange dem med throw() i funktionens deklaration. Man är då garanterad att inga andra undantag kastas. Kollen sker under körning och kan kasta std::unexpected om ett otillåtet undantag upptäcks.

Funktionsdeklarationer med throw() int foo() throw() return 0; class A public: int bar() throw(); void baz() throw(std::bad_alloc); ;

Funktionsdeklarationer med throw() Exempel på hur undantag bör hanteras för att följa specifikationen: void foo() throw(std::bad_alloc) // specificera undantag try... catch(std::bad_alloc &) // ta emot minnesfel throw; // kasta vidare catch(...) std::cout << "unknown exception" << std::endl; // kastar inget undantag

Deklarationer för virtuella funktioner Virtuella, nedärvda funktioner är begränsade till att kasta undantagen i basklassens funktion class A virtual void f() throw(x, Y); virtual void g() throw(x); virtual void h() throw(); ; class B : public A virtual void f() throw(); // ok: mer restriktiv virtual void g() throw(x); // ok: lika restriktiv virtual void h() throw(x, Y); // fel: mer tillåtande ;

Övriga byggstenar Konstruktorer Objekt eller referens Funktions-try Hanteringsfunktioner

Konstruktorer och undantag Undantag är det enda säkra sättet att indikera ett fel från konstruktorn Vid undantag från konstruktorn har objektet ingen livstid (har aldrig funnits) Samma för vektorer av objekt A *p = new A[10]; Om något av objekten släpper ifrån sig ett undantag destrueras hela vektorn

Objekt eller referens till catch? För att använda polymorfi måste man ha en pekare eller referens Om man anger ett objekt i catch kan man (som vanligt) inte använda polymorfi try throw std::bad_alloc(); catch(std::exception e) std::cout << e.what(); // skriver ut 'exception' try throw std::bad_alloc(); catch(std::exception &e) std::cout << e.what(); // skriver ut 'bad_alloc'

try runt funktionskropp Man kan innesluta en hel funktionskropp i try: void foo() try // foo är en funktion // funktionskropp for(int j = 0; ; j++) // oändlig loop int *i = new int[100000]; // som läcker minne catch(exception &e) // tar emot undantag std::cout << e.what(); // kastade i kroppen catch(...) std::cout << "unknown exception" << std::endl;

Konstruktorns initialiseringlista try runt konstruktorns funktionskropp kan hantera undantag som kastats i initieringslistan int foo() throw 7; return 0;... A::A() try : i(foo()) // foo kastar int /* konstruktorns kropp */ catch(int) std::cout << "int exception" << std::endl; throw; // måste kasta catch(...) std::cout << "unknown exception" << std::endl; throw; // måste kasta

Hanterare av undantag Vissa vanligt förekommande undantag kan hanteras med speciella hanteringsrutiner: void my_new_handler() std::cout << "out of mem"; exit(1); void my_unexpected_handler() std::cout << "unknown error"; void (*old)(); // standardhanterare sparas old = set_new_handler(my_new_handler); new int[-1]; set_new_handler(old); // sätt tillbaka gammal old = set_unexpected(my_unexpected_handler);... set_unexpected(old); // sätt tillbaka gammal