Quote:
Originally Posted by Nightblizard
Wenn eine Funktion / Methode nicht mit nothrow definiert wurde, dann ist davon auszugehen, dass sie eine Exception werfen kann.
|
Nicht in jeder Sprache gibt es so etwas (ungeachtet der Tatsache, dass wir hier im C++ Bereich sind). Aber genau da liegt auch das Problem: Grundsätzlich "kann" fast alles eine Exception schmeißen. Nur ob das wirklich in einem realistischen Szenario der Fall sein wird, ist eine andere Frage. In Sprachen wie Java, wo man zum catchen gezwungen wird, ist das dann entsprechend nervig.
Dennoch darf man das nicht aus den Augen verlieren, gerade bei Operationen auf persistenten Speicher. An einer Stelle eine potenzielle Exception (und damit eventuell die Notwendigkeit eines Rollbacks) vergessen und schon verursacht ein Fehler inkonsistente Daten.
Quote:
|
Dem ersten Argument würde ich auch nur bedingt zustimmen. Denn wenn du Exceptions nur in kritischen Bereichen deines Programmes benutzt und dein Design durchdacht ist, dann wirst du einige wenige Punkte in deinem Programm haben, zu denen es zurückfällt, wenn eine Exception geworfen wird. Von denen wird es nicht viele geben und meistens wird dann so oder so das Programm terminiert.
|
Wenn man Exceptions richtig nutzt, eben als Ausnahmen, ja.
Ich bezog mich ja gerade auf die Überbenutzung von Exceptions, denn Mostey fragte ja, wieso man einen simplen Rückgabewert einer Exception vorziehen sollte. Was bei Überbenutzung von Exceptions herauskommt, sieht man am Müllhaufen namens Java.
Quote:
Du hast also nicht mehr überall Verzweigungen und wenn etwas fehlschlagen sollte, dann fällt dein Programm auf einen festen Punkt zurück. Das ist wesentlich lesbarer, als jeden Funktionsaufruf mit einem if zu versehen!
Wenn du jedoch so exzessiv Exception wirfst, wie man das z.B. in Java macht, dann wird es durchaus schnell unlesbar, das ist durchaus richtig.
|
Das geht etwas an dem vorbei, worauf ich eigentlich hinaus wollte, aber das ist ebenfalls ein wichtiger Punkt, da hast du Recht. Schon alleine die Unterscheidung zwischen Runtime Exceptions und Compiletime Exceptions (und der Catchzwang für letztere) ist absolut lächerlich - Exceptions sind immer Ausnahmen zur Laufzeit. Naja, dass Java totaler Schrott ist, haben wir ja nun eh schon oft genug festgestellt.
Was ich eigentlich meinte ist aber tatsächlich, dass der Fehlerpfad verschwindet. Das ist gerade beim Testen und Ableiten von Äquivalenzklassen hinderlich, wenn du völlig übersiehst, dass an Stelle X Exception Y auftreten könnte. Und wenn das dann noch für "zu viel" verwendet wird (an Stellen, an denen ein Rückgabewert reichen würde), hast du schnell mal einen nicht unwahrscheinlichen Testfall, der aber auf den ersten Blick nicht auffällt.
Quote:
|
Das ist ein ganz einfach reduziertes Beispiel. Versuche es ruhig einmal selber äquivalenten, nicht trivialen Code mit und ohne Exceptions zu schreiben. Das Ergebnis wird dich verblüffen!
|
Nicht wirklich, denn ich bin mir ja um die Eleganz von Exceptions bewusst ;O Allerdings ist das gerade bei trivialem Code so eine Sache. Exceptions und das Stack-Unwinding zeigen ja erst in großem Code ihre eigentliche Stärke (die von dir angesprochenen wegfallenden if-Ketten).
So wie ich das sehe, haben wir aber doch grundsätzlich eine ähnliche Ansicht über die Frage wann man Exceptions nutzen sollte und wann nicht. Dementsprechend würde ich vorschlagen, diese Grundsatzdiskussion dann nun auch aus diesem Thread herauszuhalten. Dem TE wird sie eh nicht all zu viel bringen.