30.06.2013 Aufrufe

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

Softwareentwicklung in C++ - ASC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

330 11. Exceptions<br />

Vorsicht Falle: Manche Entwickler verwenden Exceptions bewusst zum<br />

Modellieren von bestimmten Control-Flows, z.B. zur Steuerung von Schleifen.<br />

Erstens stellt dies e<strong>in</strong>en groben Widerspruch zur Semantik von Exceptions<br />

dar, zweitens kann man damit besonders hübsche Zeitbomben bauen, die<br />

viele Leute an den Rand der Verzweiflung treiben können.<br />

Nehmen wir zum Beispiel an, dass e<strong>in</strong> Entwickler <strong>in</strong> e<strong>in</strong>er Schleife e<strong>in</strong><br />

Vektor-Objekt Element für Element durchlaufen will und <strong>in</strong>nerhalb der<br />

Schleife irgendwelche Methoden auf diesen e<strong>in</strong>zelnen Objekten aufruft. Nehmen<br />

wir weiters an, dass der Vektor so implementiert ist, dass bei unerlaubter<br />

Indizierung e<strong>in</strong>e IndexOutOfBoundsException geworfen wird. Der Entwickler<br />

kommt auf die glorreiche Idee, e<strong>in</strong>e Endlosschleife zu implementieren und<br />

diese <strong>in</strong> e<strong>in</strong> try mit zugehörigem catch auf die IndexOutOfBoundsException<br />

e<strong>in</strong>zubetten. Sobald die Exception geworfen wird, wird angenommen, dass<br />

alle Elemente im Vektor abgearbeitet wurden, denn man hat mit e<strong>in</strong>em zu<br />

großen Index zugegriffen.<br />

Jetzt passiert allerd<strong>in</strong>gs Folgendes: In e<strong>in</strong>er der Methoden, die auf e<strong>in</strong> E<strong>in</strong>zelobjekt<br />

aufgerufen werden, tritt aufgrund e<strong>in</strong>es Softwarefehlers e<strong>in</strong>e ganz<br />

anders begründete IndexOutOfBoundsException auf, als die, die erwartet<br />

wird. Diese bewirkt dann, dass die Schleife unabsichtlich verlassen wird, bevor<br />

noch alle Objekte abgearbeitet wurden! Die Implementation geht aber<br />

davon aus, dass die Exception dadurch entstand, dass der Vektor fertig abgearbeitet<br />

war. Somit hat man tollerweise nur e<strong>in</strong>en Teil des Vektors abgearbeitet<br />

und sucht verzweifelt nach irgendwelchen verlorenen Objekten!<br />

Vorsicht Falle: Wie bereits erwähnt, können nicht nur Objekte, sondern<br />

auch Po<strong>in</strong>ter auf Objekte als Exceptions verwendet werden. Aus Performancegründen<br />

kann dies auch sehr geistreich se<strong>in</strong>, denn z.B. e<strong>in</strong>e Kopie e<strong>in</strong>es<br />

Po<strong>in</strong>ters anzulegen, ist im Regelfall deutlich schneller, als e<strong>in</strong>e Kopie<br />

e<strong>in</strong>es gesamten Objekts anzulegen. Nur leider übersehen manche Entwickler,<br />

dass e<strong>in</strong>e dynamisch angelegte Exception auch s<strong>in</strong>nigerweise wieder irgendwo<br />

freigegeben werden muss, wie man an folgendem Beispiel beobachten kann<br />

(exception_memory_leak_problem.cpp):<br />

1 // exception memory leak problem . cpp − demo , how a memory leak<br />

2 // can be caused by bad exception throw<strong>in</strong>g .<br />

3<br />

4<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<br />

11 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−<br />

12 class Exception<br />

13 {<br />

14 public :<br />

15 Exception ( ) { cout

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!