============================ Eigene Klassen für Ausnahmen [TOC] ============================ Anstatt _assert_ bzw. _ASSERT_ zu verwenden, wäre es auch denkbar, bei Zugriffen außerhalb des zulässigen Bereichs Ausnahmen zu erzeugen. Das hätte dann natürlich die Konsequenz, dass auf `noexcept` verzichtet werden muss. Wenn eigene Ausnahmen erzeugt werden, empfiehlt es sich, eine eigene Klasse hierfür zu definieren, die von `std::exception` aus `#include ` abgeleitet ist. Erstrebenswert wäre dann aber eine lesenswerte Meldung bei der Methode _what_, die in die Fehlermeldung aufnimmt, mit welchem Index zugegriffen wurde und welcher Indexbereich zulässig ist. Zu beachten ist dabei folgendes: * Die Methode _what_ ist als `noexcept` deklariert. * Die Zeichenkette, die wir als Zeiger des Typs `const char*` liefern, muss auch noch existieren, nachdem _what_ beendet ist. Das lässt sich erreichen, indem alles einschließlich des auszugebenden Fehlertexts bei der Konstruktion der entsprechenden Ausnahme vorbereitet wird: * Wenn wir in eine Zeichenkette ausgeben wollen, empfiehlt sich die Verwendung eines `std::ostringstream` aus `#include `. Ein Objekt dieses Typs kann als Ausgabestrom verwendet werden und am Ende kann mit der Methode _str_ ein `std::string`-Objekt gewonnen werden, das den Ausgabetext erhält. * Dieses `std::string`-Objekt können wir dann in den privaten Teil der entsprechenden Ausnahmenklasse aufnehmen. * Wenn die Methode _what_ einen `const char*` benötigt, kann dieser mit der Methode `c_str()` erhalten werden. Aufgabe ======= Bauen Sie die Klasse _Array_ so um, dass sie bei Array-Zugriffen außerhalb des zulässigen Bereichs eine entsprechende Ausnahmenbehandlung initiiert. Ergänzen Sie die Testsuite um entsprechende Tests. Vorlage ======= :import: session07/step02/array.hpp [fold] :import: session07/step02/testit.cpp [fold] :navigate: up -> doc:index back -> doc:session07/page06 next -> doc:session07/page08