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

Vorsicht Falle: Wie bereits demonstriert wurde, kann es durch Unachtsamkeiten<br />

bei der Anordnung der catch Blöcke dazu kommen, dass manche davon<br />

nicht erreichbar s<strong>in</strong>d. Dieses Problem kann man leicht vermeiden, <strong>in</strong>dem<br />

man Klassen, die tiefer <strong>in</strong> der Ableitungshierarchie stehen, weiter oben fängt<br />

und solche, die höher stehen, entsprechend weiter unten, um “den Rest” der<br />

Exceptions, die nicht explizit mit ihrer genauen Klasse angegeben wurden,<br />

auch noch s<strong>in</strong>nvoll zu fangen.<br />

Das Verhalten von Exceptions, dass sie entsprechend ihrer Typenhierarchie<br />

behandelbar s<strong>in</strong>d, hilft enorm beim Design großer Libararies. Es hat<br />

sich s<strong>in</strong>nvollerweise e<strong>in</strong>gebürgert, dass es für e<strong>in</strong>e Library e<strong>in</strong>en bestimmten<br />

Basis Exceptiontyp gibt, von dem alle anderen abgeleitet s<strong>in</strong>d. Zum Beispiel<br />

könnte man <strong>in</strong> e<strong>in</strong>er Library mit mathematischen Klassen e<strong>in</strong>e Basis<br />

Exception MathException def<strong>in</strong>ieren. Davon abgeleitet wäre dann z.B. e<strong>in</strong>e<br />

DivisionByZeroException, e<strong>in</strong>e VectorException, e<strong>in</strong>e MatrixException,<br />

etc. Sollte man bestimmte Exceptions gesondert behandeln wollen, fängt<br />

man diese speziell, wenn nicht, reicht e<strong>in</strong> catch auf e<strong>in</strong>e MathException und<br />

dadurch fängt man automatisch alle möglicherweise auftretenden Exceptions<br />

aus dieser Library.<br />

Jetzt bleibt noch e<strong>in</strong>e Frage offen: Was passiert, wenn e<strong>in</strong>e Exception geworfen<br />

wird, aber ke<strong>in</strong> passendes catch dazu auff<strong>in</strong>dbar ist? Irgendwann ist<br />

ja das Stack Unw<strong>in</strong>d<strong>in</strong>g e<strong>in</strong>mal am Ende des Stacks angelangt. In diesem<br />

Fall wird e<strong>in</strong>e Standard Behandlung durchgeführt, die üblicherweise zum<br />

Programmabbruch mittels abort() führt. Wie dieser Mechanismus genau<br />

funktioniert und wie man sich z.B. zu Debugg<strong>in</strong>g Zwecken noch <strong>in</strong> diesen<br />

e<strong>in</strong>kl<strong>in</strong>ken kann, wird <strong>in</strong> Abschnitt 15.7 besprochen. Im Augenblick genügt<br />

es, zu wissen, wie man Exceptions s<strong>in</strong>nvoll fängt und ich möchte allen Lesern<br />

unbed<strong>in</strong>gt anraten, die Behandlung von Exceptions auch gewissenhaft<br />

durchzuführen, damit es gar nicht erst zu sogenannten uncaught Exceptions<br />

kommen kann.<br />

E<strong>in</strong>e Anmerkung hätte ich noch zur Deklaration von möglichen Exceptions,<br />

die aus e<strong>in</strong>er Methode oder Funktion geworfen werden, mittels<br />

throw(...): Ebenso wie beim Fangen von Exceptions, bei der nicht der<br />

genaue Typ, sondern die Typenkompatibilität zählt, verhält es sich bei<br />

der Angabe von Exceptions, die geworfen werden können. In der Angabe<br />

mit throw(...) muss nur e<strong>in</strong> kompatibler Typ, also entweder die genaue<br />

Exception oder e<strong>in</strong>e ihrer Basisklassen angegeben se<strong>in</strong>. Man könnte<br />

also zum Beispiel <strong>in</strong> unserem Demoprogramm <strong>in</strong> Zeile 78 auch e<strong>in</strong>fach<br />

throw(Exception) schreiben und würde damit ke<strong>in</strong> Problem heraufbeschwören,<br />

denn DerivedDException ist ja von Exception abgeleitet. Im<br />

Falle, dass man e<strong>in</strong> Overrid<strong>in</strong>g e<strong>in</strong>er Methode macht, bei der bereits e<strong>in</strong> throw<br />

deklariert wurde, kann diese Deklaration <strong>in</strong> der abgeleiteten Klasse entweder<br />

gleich se<strong>in</strong>, oder die Orig<strong>in</strong>aldeklaration e<strong>in</strong>schränken. Das ist auch völlig logisch,<br />

denn damit erreicht man, dass immer maximal die Exceptions geworfen

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!