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.

490 15. Verschiedenes<br />

98 }<br />

99<br />

100 s e t t e r m i n a t e ( old term<strong>in</strong>ate handler ) ;<br />

101<br />

102 return ( 0 ) ;<br />

103 }<br />

Wir haben es hier mit e<strong>in</strong>er BadClass und mit e<strong>in</strong>er VeryBadClass zu tun.<br />

Die VeryBadClass zeichnet sich dadurch aus, dass sie ohne Rücksicht auf<br />

Verluste aus dem Destruktor e<strong>in</strong>e Exception wirft. Die BadClass ist e<strong>in</strong> wenig<br />

rücksichtsvoller und wirft nur dann e<strong>in</strong>e Exception, wenn nicht gerade e<strong>in</strong><br />

Stack Unw<strong>in</strong>d<strong>in</strong>g im Gange ist. Ob das der Fall ist, f<strong>in</strong>det man durch Aufruf<br />

der Funktion uncaught_exception <strong>in</strong> Zeile 50 heraus. Wenn diese Funktion<br />

true liefert, dann ist gerade e<strong>in</strong> Stack Unw<strong>in</strong>d<strong>in</strong>g im Gang, ansonsten nicht.<br />

In unserem ma<strong>in</strong> legen wir <strong>in</strong> den Zeilen 82–83 zwei Variablen vom Typ<br />

BadClass an. Sobald die erste der beiden im Zuge des Verlassens des umschließenden<br />

Blocks ihr Leben verwirkt hat, wirft sie aus dem Destruktor<br />

e<strong>in</strong>e Exception. Dadurch wird das Stack Unw<strong>in</strong>d<strong>in</strong>g ausgelöst und im Zuge<br />

dessen wird auch die zweite Variable destruiert. Diese erkennt im Destruktor,<br />

dass sie sich mit dem Werfen von Exceptions gefälligst zurückhalten soll und<br />

verhält sich entsprechend brav. Dadurch gel<strong>in</strong>gt es dem Programm, sich bis<br />

zum entsprechenden catch <strong>in</strong> den Zeilen 85–88 durchzukämpfen.<br />

Anders ist die Situation schon bei unserer VeryBadClass. Auch hier wird<br />

beim ersten Destruktoraufruf e<strong>in</strong>e Exception geworfen, das e<strong>in</strong> Stack Unw<strong>in</strong>d<strong>in</strong>g<br />

zur Folge hat. Im Zuge dessen wirft aber auch noch die zweite Instanz<br />

dieser Klasse schwachs<strong>in</strong>nigerweise aus dem Destruktor e<strong>in</strong>e Exception. Dadurch<br />

bleibt gar nichts Anderes mehr übrig, als das Programm zu beenden.<br />

Wie man am folgenden Output sieht, wird auch dafür wieder der entsprechende<br />

term<strong>in</strong>ate Handler herangezogen, den wir schon von den uncaught<br />

Exceptions her kennen.<br />

BadClass d e s t r u c t o r<br />

stack unw<strong>in</strong>d<strong>in</strong>g not <strong>in</strong> progress . . . throw<strong>in</strong>g OneException<br />

BadClass d e s t r u c t o r<br />

stack unw<strong>in</strong>d<strong>in</strong>g <strong>in</strong> progress . . . not throw<strong>in</strong>g an exception<br />

caught OneException<br />

VeryBadClass d e s t r u c t o r<br />

VeryBadClass d e s t r u c t o r<br />

preMortemExceptionProblemFunction c a l l e d<br />

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

Vorsicht Falle: Auch wenn man im Destruktor nach entsprechender Absicherung<br />

Exceptions werfen kann, muss ich zu äußerster Vorsicht mahnen!<br />

Destruktoren müssen so entworfen werden, dass diese Maßnahme nicht nötig<br />

ist, sonst landet man irgendwann <strong>in</strong> Teufels Küche. Die Problematik ist, dass<br />

man <strong>in</strong> gewissen Situationen Exceptions nicht werfen kann, weil gerade e<strong>in</strong><br />

Stack Unw<strong>in</strong>d<strong>in</strong>g passiert. Was tut man aber <strong>in</strong> so e<strong>in</strong>er Situation mit Exceptions,<br />

die e<strong>in</strong>em im Destruktor von dar<strong>in</strong> aufgerufenen Methoden um die<br />

Ohren geworfen werden? E<strong>in</strong> silent Catch führt garantiert zur Katastrophe!

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!