Frage zu Throw
-
Xa1ro schrieb:
Ist es möglich folgenden Code [...] auch so zu schreiben [...] ohne eine Fehlermeldung zu erhalten.
Falls jemand diese Funktion impletieren wollte, müsste er sonst immer try catch verwenden.//#define ThrowExceptions inline void nop(){} #ifndef ThrowExceptions # define throw nop(); #endif void something(void) { throw "ERROR"; } int main(int argc, char *argv[]) { something(); }
So könnte man sich mit dem Präprozessor was zusammenbasteln. Oder du übergibst jeder Funktionen einen bool Parameter ThrowExceptions. Wirklich schön ist das aber auch nicht... Vielleicht hat ja jemand ne bessere Idee.
EDIT: Nochwas am code geändert.
-
godlikebot schrieb:
Vielleicht hat ja jemand ne bessere Idee.
EDIT: Nochwas am code geändert.diesen schwachfug bleiben zu lassen?
Ein Fehler ist ein Fehler, auch wenn man ihn ignoriert.
-
Ach so meint er das? Welchen Grund soll es denn geben, dass eine Funktion mal was wirft und mal nicht?
Fangen muss man deswegen nicht alles (außer vielleicht ganz unten in main), ich würde nie ein std::invalid_argument fangen.
-
Optimizer schrieb:
ich würde nie ein std::invalid_argument fangen.
und ich nie werfen
-
Ja, sorry... Ich seh's, war n Denkfehler. Der Code würde weiterlaufen und dann wahrscheinlich trotzdem irgendwann abschmieren (oder zum. nicht richtig arbeiten), weil der Fehler einfach ignoriert wurde.
OK, meinen Post dann bitte nicht weiter beachten :).
-
Shade Of Mine schrieb:
Optimizer schrieb:
ich würde nie ein std::invalid_argument fangen.
und ich nie werfen
Ich weiß.
-
Ich erklärs nochmal:
Nehmen wir an ich erstelle eine Klasse Namens "Erde".
Jetzt geht der Benutzer hin und will diese Klasse verwenden.Die Klasse Erde hat eine Funktion, nennen wir sie mal "Erschaffe".
In der Funktion "Erschaffe" kann es zu Fehlern kommen, diese schicke ich mit throw an den try-Block der nächsthöheren Ebene.try { Erde.Erschaffe(); } catch(...) {}
Damit kann der Benutzer die Funktion benutzen. Wozu? Ganz einfach. Jetzt kann er seine eigene Fehlermeldung ausgeben. Schön und Gut. Aber was ist, wenn der Benutzer nicht nach Fehlern prüfen will. Tja. Deswegen kam meine Frage. Schließlich soll man wählen können, um es Flexibler zu gestalten.
Bevor ihr mich erschlagt, erhängt oder sonst was mit er... . Ja, ich weiss es gibt 100 mal bessere Lösungen. Die weniger anfällig sind und bessere Lösungswege bieten. Ich bin aber erstens Faul (Besserung in Sicht) und wollte zweitens gucken, ob jemand einen Weg kennt. Obwohl ich zweifle, dass es einen Vernünftigen gibt.
Ich will halt wieder C++ lernen. (hab alles vergessen)
C kann ich noch. Aber manche Ansätze lassen sich mit C++ besser lösen. Dadurch steigt aber die Komplexität und ich bin mir nicht immer 100% sicher, ob ich alles verstanden hab.Hoffentlich war das jetzt verständlicher.
-
Aber was ist, wenn der Benutzer nicht nach Fehlern prüfen will.
Dann prüft er nicht und das Programm kackt ab. Ist doch ok.
Was mich mehr irritiert, dass du das irgendwie so entspannt siehst. "Hmmmm ja, also ich werf mal Exception zum fangen und wenn sie keiner fängt, is es ja auch nicht so schlimm".
Die Exception ist ein Hilfeschrei der Methode. Wenn sie durch 0 teilen soll, welches Ergebnis soll sie zurückliefern? Sie kann nichts sinnvolles machen. Also wirft sie in verzweifelter Not ne Exception und sagt "des ko ja net sei".
Und genau in so einer Situation darf man das nicht relaxed sehen und nur auf Wunsch des Aufrufers eine Exception werfen. Entweder es passt aus Sicht der Methode, oder es passt unerwarteterweise nicht. Und wenn es nicht passt, hat das die Methode nicht zu interessieren, ob dem Aufrufer ne Exception jetzt passt.
-
ansonsten schau dir mal an, wies die iostream library macht, die lässt die wahl zwischen a) exceptions und b) abfrage von fehlerwerten
-
otze schrieb:
ansonsten schau dir mal an, wies die iostream library macht, die lässt die wahl zwischen a) exceptions und b) abfrage von fehlerwerten
Was natürlich eine designtechnische Katastrophe ist.
von den IOStreams würde ich mir nicht sonderlich viel abschauen.