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

Der Grund hierfür ist leicht e<strong>in</strong>zusehen, wenn man sich kurz überlegt, was<br />

bei Exceptions passiert. Wir haben bereits diskutiert, dass bei e<strong>in</strong>er Exception<br />

das sogenannte Stack Unw<strong>in</strong>d<strong>in</strong>g stattf<strong>in</strong>det. Dabei werden natürlich<br />

alle auto-Variablen aus dem Speicher entfernt (und natürlich destruiert), die<br />

ihre Lifetime h<strong>in</strong>ter sich haben, wenn der Block, <strong>in</strong> dem sie def<strong>in</strong>iert wurden,<br />

verlassen wird. Und jetzt stellen wir uns vor, dass e<strong>in</strong>e Variable im Zuge des<br />

Stack Unw<strong>in</strong>d<strong>in</strong>gs destruiert wird und selbst e<strong>in</strong>e Exception wirft. Welche<br />

der beiden Exceptions soll jetzt behandelt werden? Die erste, die das Stack<br />

Unw<strong>in</strong>d<strong>in</strong>g <strong>in</strong> Gang gesetzt hat oder die zweite, die während des Unw<strong>in</strong>d<strong>in</strong>gs<br />

passiert ist? Beide gleichzeitig behandeln geht nicht, e<strong>in</strong>e davon e<strong>in</strong>fach verwerfen<br />

geht auch nicht, e<strong>in</strong> tolles Dilemma! Es wird <strong>in</strong> diesem Fall e<strong>in</strong>fach der<br />

brutale Weg gegangen und das Programm <strong>in</strong>tern mittels abort abgewürgt.<br />

Das wollen wir natürlich alle nicht, dementsprechend ist die starke Empfehlung<br />

von oben unbed<strong>in</strong>gt e<strong>in</strong>zuhalten!<br />

Vorsicht Falle: Wenn man unvorsichtig ist, kann es passieren, dass <strong>in</strong> e<strong>in</strong>em<br />

Destruktor e<strong>in</strong>e Methode bzw. Funktion aufgerufen wird, die selbst e<strong>in</strong>e Exception<br />

werfen kann. In solchen Fällen darf niemals übersehen werden, dass<br />

man im Destruktor selbst e<strong>in</strong> entsprechendes try-catch Konstrukt unterbr<strong>in</strong>gt,<br />

ansonsten würde ja unabsichtlich die Exception aus dem Destruktor<br />

h<strong>in</strong>aus geworfen werden!<br />

Vorsicht Falle: Leider gibt es immer wieder Entwickler, die der Me<strong>in</strong>ung<br />

s<strong>in</strong>d, dass man Exceptions am besten e<strong>in</strong>fach ignoriert, um sie nach außen<br />

zu verstecken. Zu diesem Zweck bauen sie sogenannte silent Catches <strong>in</strong> ihren<br />

Code e<strong>in</strong>, also solche, die e<strong>in</strong>fach e<strong>in</strong>en leeren catch Block besitzen. Dies<br />

darf man niemals machen, denn damit gel<strong>in</strong>gt es bravourös, dass man Fehler,<br />

die auftreten und sauber gemeldet würden, kommentarlos ignoriert. Damit<br />

können sich dann Programme unheimlich komisch verhalten, weil sie eigentlich<br />

<strong>in</strong>tern <strong>in</strong> e<strong>in</strong>em Fehlerzustand s<strong>in</strong>d, aber trotzdem weiterlaufen, als wäre<br />

nichts geschehen.<br />

Die allerschlimmsten Exemplare von silent Catches, die man immer wieder<br />

f<strong>in</strong>det, s<strong>in</strong>d solche, bei denen im leeren catch Block e<strong>in</strong> Kommentar à la<br />

// this exception can never happen<br />

steht. Der richtige Standpunkt dazu ist allerd<strong>in</strong>gs: Wenn die Exception nicht<br />

auftreten kann, dann muss man zum<strong>in</strong>dest e<strong>in</strong>en Output e<strong>in</strong>bauen, der den<br />

“unmöglichen” Fall meldet. Hatte man Recht und die Exception tritt nie<br />

auf, dann stört auch der Output nicht. Hatte man allerd<strong>in</strong>gs unrecht (sehr<br />

oft, v.a. nach Programmänderungen!!!), dann sieht man wenigstens, dass e<strong>in</strong><br />

Fehler aufgetreten ist!<br />

Vor allem sollte man sich wirklich überlegen, ob man e<strong>in</strong> solches catch<br />

nicht gleich bleiben lässt und jemandem “weiter oben” die Behandlung<br />

überlässt, für den Fall, dass die Exception doch auftritt.

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!