Error handling: Exception vs. Error return value
-
Ich wüsste gerne einmal die Argumentation, die zu der Aussage führte...
-
Wenn Fehler nicht Teil des normalen Programmablaufs sind, nehm ich immer Exceptions/Asserts.
Exceptions sind deutlich eleganter, sicherer, auf vielen Rechnern performanter als Fehlercodes oä. als Rückgabewert.
-
Ethon schrieb:
auf vielen Rechnern performanter als Fehlercodes oä. als Rückgabewert.
Woher nimmst du die Info? Und vor allem, warum ist das so?
Ich dachte immer, Exceptions sind lahme Krücken.
-
theliquidwave schrieb:
Ethon schrieb:
auf vielen Rechnern performanter als Fehlercodes oä. als Rückgabewert.
Woher nimmst du die Info? Und vor allem, warum ist das so?
Ich dachte immer, Exceptions sind lahme Krücken.Auf x64-CPUs lässt sich Exception-Handling komplett kostenlos implementieren, WENN die Exception nicht fliegt. Wenn sie fliegt ist es teurer.
Aber da Fehler generell Ausnahmen und nicht Regelfall sind, kann man davon ausgehen dass es performanter ist. (Hab ja gesagt dass ich Return-Werte nutzen würde, wenn Fehler zum normalen Programmablauf gehören)
-
Wenn Fehler zum normalen Programmablauf zählen, dann handelt es sich ja eigentlich nicht um Fehler, oder? Dann sind es vielleicht Ereignisse oder Zustände^^
Z.b. halte ich eine IncompetentUserException für fragwürdig, wobei eine CompetentUserException schon nachvollziehbar ist!
-
Hier ein etwas anderer Ansatz: http://isocpp.org/blog/2012/12/systematic-error-handling-in-c-andrei-alexandrescu . Exceptions werden mit dem Wert verknueft. Sowas Wie Maybe/Either in Haskell, wie boost.optional nur mit Exceptions. Exceptions werden geworfen, wenn das Ergebnis benutzt wird. Wenn keine Exception geworfen werden soll, dann kann vorher mittels valid das Ergebnis geprueft werden. Der zweite Teil beschaeftigt sich mit ScopeGuards und wie im Fehlerfall elegant aufgeraemt werden kann.
-
Ethon schrieb:
Auf x64-CPUs lässt sich Exception-Handling komplett kostenlos implementieren
Ist das auch bei 32bit Prozessen so, die auf einem x64_86 System laufen? (Windows 8 64bit zun Beispiel)
-
theliquidwave schrieb:
Ethon schrieb:
Auf x64-CPUs lässt sich Exception-Handling komplett kostenlos implementieren
Ist das auch bei 32bit Prozessen so, die auf einem x64_86 System laufen? (Windows 8 64bit zun Beispiel)
Nein, ein 32bit Prozess ist ein 32bit Prozess.
Aber es ist nicht so als würde Exception Handling so teuer sein.
Du kannst dir das hier mal den ersten von meinem Artikel hier durch lesen:
http://www.c-plusplus.net/forum/219865
-
cooky451 schrieb:
Siehe z.B. Alexandrescus Expected<T>, durchaus ein interessantes Konzept.
Ich bin gerade dabei mir seinen Vortrag über genau das anzusehen, aber ich habe ein Problem mit dem Verstehen des Konstruktors.
template <class T> class Expected { union { T ham; std::exception_ptr spam; }; bool gotHam; // ... Expected(const Expected& rhs) : gotHam(rhs.gotHam) { if (gotHam) new(&ham) T(rhs.ham); // ^~~~~~~~~~~~~~~~~~~~~ else new(&spam) std::exception_ptr(rhs.spam); // ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // was bedeutet das? } // ... };
Ich weiß, dass man den new-operator mit mehreren Parametern überladen kann, allerdings finde ich keine Überladung mit bool, geschweige denn mit T
Ich habe das jetzt so verstanden, dass (if-block:) ham mit einer kopie von rhs.ham bzw. (else-Block:) spam mit einer kopie von rhs.spam initialisiert wird
-
Cyres schrieb:
Ich bin gerade dabei mir seinen Vortrag über genau das anzusehen, aber ich habe ein Problem mit dem Verstehen des Konstruktors.
Was soll das in diesem Thread?
Expected(const Expected& rhs) : gotHam(rhs.gotHam) { if (gotHam) new(&ham) T(rhs.ham); // ^~~~~~~~~~~~~~~~~~~~~ else new(&spam) std::exception_ptr(rhs.spam); // ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // was bedeutet das? }
Das ist ein inplace-new.
Die union initialisiert erst einmal gar kein Member. Sie weiss ja nicht, ob du ham oder spam möchtest.Wenn du einen Wert im Unionmember ham haben möchtest, musst du den Konstruktor für das Element händisch aufrufen. Die Syntax dazu lautet halt new(&ham). Siehe http://en.cppreference.com/w/cpp/language/union
-
hamspammer schrieb:
Das ist ein inplace-new.
Auch placement-new genannt.
-
hamspammer schrieb:
Was soll das in diesem Thread?
Hier wurden verschiedene Arten von Error-Handling erläutert, zu einem davon habe ich Fragen, weil ich etwas davon nicht verstehe, also frage ich hier nach.
hamspammer schrieb:
Das ist ein inplace-new.
cooky451 schrieb:
Auch placement-new genannt.
Danke für die Antworten, gerade mit dem Begriff "placement-new" konnte ich mehr anfangen
-
Cyres schrieb:
hamspammer schrieb:
Was soll das in diesem Thread?
Hier wurden verschiedene Arten von Error-Handling erläutert, zu einem davon habe ich Fragen, weil ich etwas davon nicht verstehe, also frage ich hier nach.
Und erweckst den Eindruck, dass die vorherigen 6 Seiten irgendwie für deine Frage relevant wären. Was sie nicht sind. Deine Frage hätte genau so gut im Vakuum funktioniert.