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.

488 15. Verschiedenes<br />

zurückkehrt. Man hat nur noch die Chance, selbst so def<strong>in</strong>iert wie möglich<br />

auszusteigen, bevor das System das von sich aus übernimmt. In Zeile 32 passiert<br />

genau das. Würde man hier nicht mittels exit aussteigen, und wider<br />

Erwarten aus der Funktion wieder herauskommen, dann würde automatisch<br />

abort aufgerufen werden. Den Handler setzt man durch Aufruf der Methode<br />

set_term<strong>in</strong>ate <strong>in</strong> Kraft. Der weltbewegende Output dieses sterbenden<br />

Meisterwerks liest sich dann so:<br />

throw<strong>in</strong>g OneException<br />

preMortemExceptionProblemFunction c a l l e d<br />

time to say good bye . . .<br />

In Kapitel 11 wurde bereits e<strong>in</strong>dr<strong>in</strong>glichst gesagt, dass man unbed<strong>in</strong>gt dafür<br />

sorgen muss, dass aus e<strong>in</strong>em Destruktor ke<strong>in</strong>e Exceptions geworfen werden.<br />

Durch das catch(...) Konstrukt haben wir auch jetzt e<strong>in</strong>e schöne Möglichkeit,<br />

<strong>in</strong>nerhalb e<strong>in</strong>es Destruktors auf alle Eventualitäten zu reagieren und<br />

heimtückische Exceptions, die aus aufgerufenen Teilen stammen, daran zu<br />

h<strong>in</strong>dern, aus dem Destruktor h<strong>in</strong>aus zu fallen. Wie bereits erklärt kann e<strong>in</strong><br />

Destruktor eben im Zuge e<strong>in</strong>es Stack Unw<strong>in</strong>d<strong>in</strong>gs aufgerufen werden und<br />

dann würden bösartigerweise plötzlich zwei Exceptions gleichzeitig auftreten.<br />

Wenn man darüber genau nachdenkt, dann kommt man allerd<strong>in</strong>gs zu<br />

der Erkenntnis, dass man Exceptions aus e<strong>in</strong>em Destruktor theoretisch schon<br />

werfen könnte, wenn man nur sicherstellt, dass man nicht gerade im Zuge e<strong>in</strong>es<br />

Stack Unw<strong>in</strong>d<strong>in</strong>gs destruiert wird. Genau das ist auch wirklich der Fall,<br />

wie im folgenden Beispiel zu sehen ist (destructor_exc_demo.cpp):<br />

1 // destructor exc demo . cpp − demo f o r exceptions <strong>in</strong> d e s t r u c t o r s<br />

2<br />

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

4 #<strong>in</strong>clude < t y pe<strong>in</strong>fo><br />

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

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

7<br />

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

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

10 us<strong>in</strong>g std : : s e t t e r m i n a t e ;<br />

11 us<strong>in</strong>g std : : uncaught exception ;<br />

12<br />

13 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

14 class OneException<br />

15 {<br />

16 } ;<br />

17<br />

18 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

19 /∗<br />

20 ∗ VeryBadClass<br />

21 ∗<br />

22 ∗ throws an exception <strong>in</strong> the d e s t r u c t o r . . .<br />

23 ∗<br />

24 ∗/<br />

25<br />

26 class VeryBadClass<br />

27 {<br />

28 public :<br />

29 virtual ˜ VeryBadClass ( )<br />

30 {<br />

31 cout

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!