30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

11. Exceptions 327<br />

Objekte <strong>in</strong> ihrem “halbtoten” Zustand belassen, denn das resultiert <strong>in</strong> ganz<br />

tollen und langen Debugg<strong>in</strong>g-Sessions, <strong>in</strong> denen man teuflische Gespenster<br />

jagen darf.<br />

In unserem Fall ist dieses Problem leicht <strong>in</strong> den Griff zu bekommen, man<br />

braucht nur e<strong>in</strong> entsprechendes delete durchzuführen, bevor man die Exception<br />

im Konstruktor wirft. Damit hat man s<strong>in</strong>nvoller- und robusterweise<br />

ke<strong>in</strong> “halbtotes” Objekt konstruiert, sondern die “halbe” Konstruktion wieder<br />

rückgängig gemacht.<br />

Noch e<strong>in</strong> Punkt kommt hier <strong>in</strong>s Spiel: Es wurde bereits gesagt, dass alle<br />

Objekte, die fertig konstruiert wurden, auch wieder destruiert werden. Dies<br />

gilt natürlich auch für alle Member Variablen e<strong>in</strong>es Objekts, selbst wenn im<br />

Konstruktor des Objekts selbst e<strong>in</strong>e Exception geworfen wurde. Sobald diese<br />

fertig konstruiert waren, stellen sie ke<strong>in</strong>e Gefahr mehr dar. Selbiges gilt<br />

auch <strong>in</strong> Ableitungshierarchien: Sobald der Konstruktor e<strong>in</strong>er Basisklasse korrekt<br />

abgearbeitet war, wird auch deren Destruktor aufgerufen, selbst wenn<br />

im Konstruktor e<strong>in</strong>er abgeleiteten Klasse e<strong>in</strong>e Exception <strong>in</strong> Bodenhöhe geflogen<br />

kommt. Den Beweis für diese Aussagen tritt das folgende Beispiel an<br />

(another_exc_<strong>in</strong>_constructor_demo.cpp):<br />

1 // another exc <strong>in</strong> constructor demo . cpp − what happens when throw<strong>in</strong>g an<br />

2 // exception <strong>in</strong> a constructor ?<br />

3<br />

4 #<strong>in</strong>clude <br />

5 #<strong>in</strong>clude ” u s e r t y p e s . h”<br />

6<br />

7 us<strong>in</strong>g std : : cout ;<br />

8 us<strong>in</strong>g std : : endl ;<br />

9<br />

10 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

11 class Exception<br />

12 {<br />

13 public :<br />

14 Exception ( ) { }<br />

15 Exception ( const Exception& exc ) {}<br />

16 virtual ˜ Exception ( ) { }<br />

17 } ;<br />

18<br />

19 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

20 class Whatever<br />

21 {<br />

22 public :<br />

23 Whatever ( ) { cout

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!