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.

11. Exceptions 319<br />

ser auch verwendet. Dies sieht man im Output an den Meldungen<br />

copy - construct<strong>in</strong>g Exception, id = 1<br />

copy - construct<strong>in</strong>g IndexOutOfBoundsException, id = 1<br />

5. Nach Anlegen dieser Kopie ist die throw Expression abgearbeitet. Es<br />

wird also das ursprüngliche Exception Objekt damit zerstört. Dies äußert<br />

sich an den Meldungen<br />

destruct<strong>in</strong>g IndexOutOfBoundsException, id = 0<br />

destruct<strong>in</strong>g Exception, id = 0<br />

Dieses Zerstören ist auch der Grund, warum ich im Demoprogramm den<br />

e<strong>in</strong>zelnen Objekten den Member my_id_ verpasst habe: Man sieht, welche<br />

Instanz zerstört wird. Bei uns hat das Orig<strong>in</strong>al die Id 0 und die Kopie<br />

hat die Id 1.<br />

6. Nach dem Zerstören des Orig<strong>in</strong>als beg<strong>in</strong>nt das Stack Unw<strong>in</strong>d<strong>in</strong>g, also<br />

das Zurückgehen <strong>in</strong> der Aufrufhierarchie am Stack, bis e<strong>in</strong> entsprechender<br />

try Block mit zugehörigem catch gefunden wird. Hierbei wird<br />

setElementAt verlassen und das erste passende catch f<strong>in</strong>det sich direkt<br />

<strong>in</strong> der aufrufenden ma<strong>in</strong> Funktion <strong>in</strong> Zeile 170. Genau dort läuft das<br />

Programm dann weiter, wie sich am Output leicht erkennen lässt.<br />

7. Beim Verlassen des catch Blocks ist auch die Lifetime der Kopie des<br />

temporären Objekts zu Ende (diese war natürlich selbst e<strong>in</strong> temporäres<br />

Objekt, wie sich leicht überlegen lässt). Entsprechend f<strong>in</strong>den wir auch<br />

im Output die entsprechenden Meldungen zu den Destruktoraufrufen<br />

destruct<strong>in</strong>g IndexOutOfBoundsException, id = 1<br />

destruct<strong>in</strong>g Exception, id = 1<br />

Das Grundpr<strong>in</strong>zip des Exception Mechanismus ist im Pr<strong>in</strong>zip also recht klar<br />

und e<strong>in</strong>fach nachvollziehbar. Es wurde auch bereits erwähnt, dass es verschiedene<br />

catch Blöcke für verschiedene Exceptions geben kann. Nun stellt sich<br />

nur noch die Frage, wie diese verschiedenen Exceptions unterschieden werden.<br />

Die Antwort ist e<strong>in</strong>fach: aufgrund ihres Typs. E<strong>in</strong> bestimmter catch<br />

Block wird angesprungen, wenn die Exception, die geworfen wurde, e<strong>in</strong>e der<br />

folgenden Bed<strong>in</strong>gungen erfüllt:<br />

• Die geworfene Exception hat genau denselben Typ, wie im catch Statement<br />

als Parameter angegeben.<br />

• Die im catch als Parameter angegebene Exception ist e<strong>in</strong>e public Basisklasse<br />

der geworfenen Exception. Dann s<strong>in</strong>d diese beiden Typen ja bekannterweise<br />

voll kompatibel.<br />

• Wenn die geworfene Exception e<strong>in</strong> Po<strong>in</strong>ter ist (ja, auch das geht!) und<br />

dieser Po<strong>in</strong>ter zu e<strong>in</strong>em Po<strong>in</strong>ter-Parameter <strong>in</strong> e<strong>in</strong>em catch Statement typkompatibel<br />

ist.<br />

• Wenn die geworfene Exception e<strong>in</strong>e Referenz ist (wie zu erwarten, geht das<br />

auch) und diese Referenz zu e<strong>in</strong>em Referenz-Parameter <strong>in</strong> e<strong>in</strong>em catch<br />

Statement typkompatibel ist.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!