41
Neuroinformatics Group, CITEC Praxisorientierte Einführung in C++ Lektion: "Exceptions" Christof Elbrechter Neuroinformatics Group, CITEC June 18, 2014 Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 1 / 41

Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC

Praxisorientierte Einführung in C++Lektion: "Exceptions"

Christof Elbrechter

Neuroinformatics Group, CITEC

June 18, 2014

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 1 / 41

Page 2: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC

Table of Contents

◦ Allgemeines

◦ Exceptions

◦ Exceptions - Beispiel

◦ Exceptions und auto-Variablen

◦ Exceptions - Typen

◦ Catch All - Handler

◦ Exceptions weiterwerfen

◦ Dynamischer Speicher und Exceptions

◦ throw - Deklarationen

◦ Standard-Exception-Typen

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 2 / 41

Page 3: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Motivation

I Motivation:• Funktionen/Methoden brauchen Möglichkeit, Fehler anzuzeigen

I Bisher:• Rückgabewert einer Funktion/Methode• Übergabe eines Objektes per Referenz, welches den Fehler kodiert• Globale Variable

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 3 / 41

Page 4: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Motivation

// Fehler wird durch negativen Rueckgabewert angezeigtint f(int i);

// Fehler wird durch setzen von Eigenschaften von error// angezeigtint f(int i, Error &error);

// Fehler wird durch setzen von globaler Variable// angezeigtint f(int i);

I Globale Variablen von C-Standard-bibliothek benutztI Header: <cerrno>

• Nicht immer! Kann auch Makro sein

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 4 / 41

Page 5: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Rückgabewerte - Diskussion

// Fehler wird durch negativen Rueckgabewert angezeigtint f(int i);

I Nachteile:• Mögliche Rückgabewerte werden eingeschränkt• Implizit (Funktionsdeklaration nicht selbst-erklärend)• Nicht möglich für Konstruktoren/Destruktoren• Fehlerzustand muss für jeden Funktionsaufruf einzeln überpüft werden

I Vorteil:• Kein zusätzlicher Speicher- oder Rechenzeit-Overhead

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 5 / 41

Page 6: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Fehlerargument - Diskussion

// Fehler wird durch setzen von error auf true// angezeigtint f(int i, Error &error);

I Nachteil:• Fehlerzustand muss für jeden Funktionsaufruf einzeln überpüft werden

I Vorteil:• Relativ explizit• Rückgabewertebereich wird nicht eingeschränkt

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 6 / 41

Page 7: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Fehlerargument - Mit Zeigern

I Oder mit Zeigern

// Fehler wird durch setzen von error auf true// angezeigtint f(int i, Error ∗error = 0);

I Wenn error == 0 wird kein Fehlercode geschrieben

I Bei inline-Funktionen: Optimierungen möglich, wenn mit konstantem Ausdruck 0

aufgerufen

I Oft wird Typ bool* benutzt

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 7 / 41

Page 8: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Allgemeines

Globale Variable - Diskussion

// Fehler wird durch setzen von globaler Variable// angezeigtint f(int i);

I Nachteil:• Fehlerzustand muss für jeden Funktionsaufruf einzeln überpüft werden• Thread-Safety?• Implizit, nicht explizit

I Vorteil:• Rückgabewertebereich wird nicht eingeschränkt

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 8 / 41

Page 9: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions

Exceptions - Überblick

I Exceptions:• Explizit (falls gewünscht)• Schlüsselwort throw• Rückgabewertebereich wird nicht eingeschränkt• Explizite Fehlerbehandlung nicht nur für einzelne Funktions/Methoden-aufrufe möglich,sondern auch für ganze Blöcke

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 9 / 41

Page 10: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions

Exceptions - Überblick

I Exceptions werden "geworfen" oder "geschmissen"

I Mit throw kann beliebiger Typ geworfen werden

I Funktion/Methode wird bei throw beendet

// Fehler wird durch "werfen" von Ausnahme angezeigtint f(int i) {// do something// ...// oh we need to signal an error:throw Error("something went wrong!");// ...

}

I Error ist hier benutzerde�nierter Typ

I Man kann auch Werte eingebauter Typen werfen (int, float, double, bool, ...) undauch Zeiger...

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 10 / 41

Page 11: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions

Exceptions

I Exceptions sind "alternativer Rückgabewert"• Aber der Vergleich hinkt

I Besser: Exceptions stellen Möglichkeit dar, Informationen aus einem Kontext in einenanderen Kontext zu befördern

I Der andere Kontext hat evtl. die nötigen Informationen, die Exception richtig zu behandeln:

I Schlüsselwort catch

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 11 / 41

Page 12: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions - Beispiel

Exceptions - Beispiel

I Beispiel: Klasse Image hat statische Methode

Image ∗load(const char ∗fileName);

I Es können verschiedene Fehler auftreten• Datei kann nicht geö�net werden• Fehlerhafte Daten in Datei (falsche Reihenfolge, fehlende Felder, usw..)• Fehler beim Erstellen des Ziel-Image-Objekts (zuwenig Speicher zur Verfügung, usw..)• ...

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 12 / 41

Page 13: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions - Beispiel

Exceptions Beispiel

I Typ des Fehlerobjekts sollte Fehler anzeigen (damit kann man dann Funktionsüberladungausnutzen (catch))

I Über Vererbungshierarchie ist dann auch "Default"-Behandlung möglich

struct Error { };struct FileOpenError : public Error { };struct FileFormatError : public Error { };struct OutOfMemoryError : public Error { };

Image ∗load(const char ∗fileName) {// ... File could not be opened:throw FileOpenError();

// ...Oh we are out of memory:throw OutOfMemoryError();

// ...File format incorrect:throw FileFormatError();

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 13 / 41

Page 14: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions und auto-Variablen

Exceptions und auto-Variablen

I Wir haben damit Möglichkeit, Funktionen/Methoden frühzeitig zu beenden und ein Objektbeliebigen Typs (was will man mehr?) zu "werfen"

I Nützlich: C++ garantiert, dass alle angelegten auto-Variablen "aufgeräumt" werdenI Aber wer fängt die Exception auf und verwertet sie?

• Schlüsselworte try und catch...

I Und was ist mit dynamisch angelegten Objekten?

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 14 / 41

Page 15: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions und auto-Variablen

try und catch

I Schlüsselwort try kennzeichnet Anfang von Block, der getestet werden soll:

try {Image ∗i = Image::load("test.pgm");

}

I Der Block kann dabei auch mehrere Anweisungen enthalten

I Auf try folgt immer ein Block

I Aber: Noch kein korrektes C++

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 15 / 41

Page 16: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions und auto-Variablen

try und catch

I Mit Schlüsselwort catch wird Exceptionhandler angezeigt

try {Image ∗i = Image::load("test.pgm");

}catch (const Error &e) {std::cout << "Oh Oh , something ’s up!" << std::endl;

}

I Alle drei Fehler, die load werfen kann, sind abgeleitet von Error, daher "passt" dercatch-Block

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 16 / 41

Page 17: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions und auto-Variablen

try und catch

I Detailliertere Fehlerbehandlung:

try {Image ∗i = Image::load("test.pgm");

}catch (const FileOpenError &e) {std::cout << "Failed to open File" << std::endl;

}catch (const Error &e) {std::cout << "Oh Oh , something ’s up!" << std::endl;

}

I Der erste catch-Block der "passt" wird angesprungen

I Exception gilt danach als behandelt

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 17 / 41

Page 18: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions - Typen

Exceptions - Typen

I Man kann alle Typen als Exceptions werfen und fangen

I Auch Zeiger (z.B.: auf mit new angelegte Objekte)I Bei Zeigern Problem: Wer ist für die Löschung zuständig

• Jeder catch-Block, der eine Exception behandelt, muss gefangenes Objekt per deletelöschen, oder "weiterwerfen"

• Fehlerträchtig

Faustregel

I Objekte werfen � Referenzen fangen

I Polymorphismus funktioniert, und Zerstörung von Objekten passiert automatisch

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 18 / 41

Page 19: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Catch All - Handler

Catch All - Handler

I "Catch-All-Handler":

catch(...) {}

I Fängt alle Exceptions• Einfacher Weg, um alle Exceptions gleich zu behandeln, ohne explizit auf Typ der Exceptionzu achten

try {Image ∗i = Image::load("test.pgm");

}catch (...) {std::cout << "Oh Oh , something ’s up!" << std::endl;

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 19 / 41

Page 20: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions weiterwerfen

Exceptions weiterwerfen

I Ein catch-Block hat Möglichkeit, Exception weiterzuwerfen

I Schlüsselwort throw

try {Image ∗i = Image::load("test.pgm");

}catch (const Error &e){// Hier kann man z.B. die Exception ausgebenthrow; // analog zu "throw e": wird weiter geworfen

}catch (...) {std::cout << "Oh Oh , something ’s up!" << std::endl;throw; // throw ... geht ja nicht!

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 20 / 41

Page 21: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions weiterwerfen

Exceptions weiterwerden

I Jetzt fängt das Spiel von vorne an• Die Exception wird weitergeworfen• Aktuelle Funktion/Methode wird beendet• Erster passender catch-Block ausserhalb dieser Funktion/Methode wird angesprungen• Es werden wenn nötig mehrere Funktionen beendet• Falls kein passender catch-Block gefunden wird:

I Spezielle Funktion void terminate(); wird aufgerufen

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 21 / 41

Page 22: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions weiterwerfen

Exceptions weiterwerfen - Beispiel

void f() { throw int(1); }

void g() {try { f(); }catch(const Error &e) { } // handler passt nicht

}

struct X {std::string m str;X() { g(); }

};

int main() {try { X x; }catch (const Error &e) { } // handler passt nichtcatch (...) { throw; } // passt, aber wird "rethrown"

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 22 / 41

Page 23: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Exceptions weiterwerfen

Exceptions weiterwerfen

I In vorherigem Beispiel hatte X::X() keinen try-catch-Block

I Bedeutet, dass alles "weitergeworfen" wird

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 23 / 41

Page 24: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Konstruktoren und Exceptions

I Konstruktoren:• Falls in einem Konstruktor (in irgendeinem) eine Exception geworfen wird, dann werden alleElemente, die bis zu diesem Zeitpunkt initialisiert wurden, wieder freigegeben

I Objekte werden "ganz oder gar nicht" initialisiert

I Aber keine dynamisch angelegten Elementvariablen. C++ garantiert hier "nur", dass derZeiger zerstört wird

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 24 / 41

Page 25: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Konstruktoren - Beispiel

struct Turboloader {Turboloader(float pressure){

if(pressure>10) throw std::runtime error("oops");else ..

}};struct Auto {Engine m engine;Turboloader m turboLoader;Wheels ∗m wheels;Auto() : m engine("V8"), m turboLoader(11.0),

m wheels(new Wheels(4)) {}

};int main() {try {// TurboLoader Konstruktor wirft ExceptionAuto krassesGeraet;

}catch (...) { // krassesGeraet existiert hier nicht mehr }

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 25 / 41

Page 26: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Konstruktoren - Beispiel

struct Auto {Engine m engine;Wheels ∗m wheels; // Reihenfolge nun andersTurboloader m turboLoader; // hier auch!Auto() : m engine("V8"), m wheels(new Wheels(4)),

m turboLoader(11.0) {}

};

int main() {try {// TurboLoader() wirft Fehler nachdem fuer m wheels// dynamisch ein Objekt angelegt wurdeAuto karre;

}catch (...) {// karre existiert hier nicht mehr// aber das mit new Wheels(4) angelegte Wheels−Objekt

}}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 26 / 41

Page 27: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Freie Funktionen

I Das gleiche Problem mit in Funktionen per new angelegten Objekten...

void concat print(const char ∗a, const char ∗b) {char ∗s = new char[strlen(a) + strlen(b) + 1];

if (strcmp(a,"concatenate " == 0)throw Error("i feel sick of this!");

strcpy(s,a); strcpy(s+strlen(a),b);std::cout << s << std::endl;delete[] s;

}

int main() {try { concat print("concatenate ", "me"); }catch (...) { }

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 27 / 41

Page 28: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Dynamischer Speicher - Lösungen

I Lösungen:• Aufräumen bevor Fehler geschmissen wird

I Relativ fehlerträchtigI In Initialisierungsliste unmöglich

• Aufräumen nachdem Fehler geschmissen wurdeI Sehr schwierig und fehlerträchtigI In Initialisierungsliste unmöglich

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 28 / 41

Page 29: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Dynamischer Speicher - Lösungen

I Lösungen contd.• Keine Exceptions werfen, nachdem dynamisch Objekte angelegt wurden

I Manchmal umständlich oder unmöglich

• Keinen dynamischen Speicher benutzenI aja!

• Keine Exceptions werfenI Wird ja immer schlimmer :)

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 29 / 41

Page 30: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Dynamischer Speicher und Exceptions

Smart Pointer - std::auto_ptr

I C++ STL bietet einen Smart Pointer zu genau diesem Zweck an• Leider aber eben auch nur für genau diesen Zweck

I Typ std::auto_ptr<T> im Header <memory>

#include <memory>#include <stdexcept>

struct Image { ... };

int main() {std::auto ptr<Image>(new Image(640,480));throw std::runtime error("booring !!");}

I Ganz analog in e.g. Konstruktor einer Klasse

I Mehr zu Smart Pointern später

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 30 / 41

Page 31: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC throw - Deklarationen

throw - Deklarationen

I Problem: Der Deklaration von Image::load() sieht man es nicht an, dass Exceptionsgeworfen werden

I Schlüsselwort throw hat zusätzliche Rolle in Deklaration einer Funktion/Methode:

I Zeigt an, welche Exceptions geworfen werden können (mit Ausnahmen)

Image ∗load(const char ∗fileName) throw (FileOpenError ,OutOfMemoryError ,FileFormatError

);

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 31 / 41

Page 32: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC throw - Deklarationen

throw - Deklarationen - Syntax

I Syntax throw(Typ1, Typ2, ..., TypN)

I throw-Liste ist Teil der Funktions-Signatur

I Es kann nicht über unterschiedliche throw-Listen überladen werden

I Fehlende throw-Liste: Everything goes!

I Leere throw-Liste am Ende einer Funktionsdeklaration zeigt an, dass keine Exceptionsgeworfen werden sollten:

void f() throw();

I Man kann aber trotzdem welche werfen

I Seeeeehr schlechter Stil!

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 32 / 41

Page 33: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC throw - Deklarationen

throw - Schlechter Stil

I Nicht nur schlechter Stil

I C++ springt in diesem Fall zu spezieller Funktion void unexpected();

I Mit std::set_unexpected(void(*)()); kann eigene Funktion benutzt werden• Liefert alten Funktionszeiger zurück

I Default-Funktion ruft terminate(); auf

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 33 / 41

Page 34: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC throw - Deklarationen

unexpected() - Beispiel

void f() throw(X) {throw Y();

}

void really unexpected() {std::cout << "Naughty Function!" << std::endl;

}

int main() {std::set unexpected(really unexpected);try {f(); // Wirft Y−Objekt als Exception

}catch (...) {// Wird trotz "..." nicht gefangen

}}

I Programm wird trotzdem beendet

I Lösung std::bad_exception (Moment!)

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 34 / 41

Page 35: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

Standard-Exception-Typen

I C++-Standardbibliothek bietet Standard-Exception-Typen

I Deklariert im Header <exception>

I Basisklasse std::exception

I Hat Methode

virtual const char ∗what() const throw();

I Liefert textuelle Beschreibung des Fehlers

I In diesem Fall: "std::exception"

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 35 / 41

Page 36: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

Standard-Exception-Typen

I Abgeleitete Klassen:I Header <exception>

• std::bad_exception

I Header <stdexcept>• std::runtime_error

• std::logic_error

I Header <new>• std::bad_alloc

I Header <typeinfo>• std::bad_typeid

• std::bad_cast

I Header <ios_base.h>• std::ios_base::failure

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 36 / 41

Page 37: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

Standard-Exception-Typen

I std::bad_exception

I Header exception

I Wird geworfen, wenn unexpected()-Funktion Exception "weiterwirft" und throw-Liste derFunktion/Methode std::bad_exception enthält

I Kann mit catch(std::exception& e) oder ähnlichem gefangen werden

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 37 / 41

Page 38: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

bad_exception - Beispiel

void f() throw(X, std::bad exception) {throw Y();

}

void really unexpected() {throw;

}

int main() {std::set unexpected(really unexpected);

try {f(); /∗ Wirft Y−Objekt als Exception ∗/

}catch (std::bad exception &e) {// Wird gefangen

}catch (...) { /∗ usw.. ∗/ }std::cout << "life goes on though" << std::endl;

}

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 38 / 41

Page 39: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

Standard-Exception-Typen

I Header <typeinfo>I std::bad_typeid

• wird geworfen, wenn ein NULL-Zeiger in einer typeid-Expression benutzt wirdI std::bad_cast

• wird geworfen, wenn dynamic_cast mit referenzen fehlschlägt

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 39 / 41

Page 40: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

Standard-Exception-Typen

I Es existieren auch Typen, die "für den Benutzer da sind"

I Header <stdexcept>I std::runtime_error

• zeigt Fehler ausserhalb des Programms an (kaputte Netzwerkverbindung, Datei lässt sich nichtö�nen, etc..)

I std::logic_error

• zeigt Fehler in der Programmlogik an

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 40 / 41

Page 41: Praxisorientierte Einführung in C++ Lektion: 'Exceptions' · 2014-06-18 · Jeder catch -Block, der eine Exception behandelt, muss gefangenes Objekt per delete löschen, oder "weiterwerfen"

Universität Bielefeld Neuroinformatics Group, CITEC Standard-Exception-Typen

runtime_error, logic_error

I std::logic_error und std::runtime_error haben Konstruktor

std::logic error(const std::string &);std::runtime error(const std::string &);

I Mit diesen kann Fehlertext gesetzt werden

I Ist dann über Methode what() zugänglich

I Guter Stil, eigene Exceptions von diesen beiden erben zu lassen

Christof Elbrechter Praxisorientierte Einführung in C++ June 18, 2014 41 / 41