Ich glaube, es ist legal, * dies aus dem Körper eines Konstruktors zu werfen. Ich würde gerne wissen, ob ich mich einfach geirrt habe (Probleme, ein Objekt zu umgehen, bevor der Konstruktor fertig ist?) Oder ob das stilistisch verabscheuungswürdig ist.Bedingungslos * dies vom Konstruktor
Ich postete eine zweite, spezifischere Frage here, die umfassend beantwortet wurde. Der Code in diesem Beitrag ist legal, wenn auch etwas seltsam.
Gegeben eine Ausnahme struct:
struct fail final : public std::logic_error
{
fail() : std::logic_error("fail") {}
using std::logic_error::logic_error;
};
und eine Reihe von Call-Sites wie:
throw fail();
// or
throw fail("oh dear");
Ich überlege die Struktur zu ändern sein:
struct fail final : public std::logic_error
{
fail() : std::logic_error("fail") { throw * this; }
fail(const char* w) : std::logic_error(w) { throw * this; }
};
Woraufhin Die Call-Sites können unverändert bleiben oder als kürzere umgeschrieben werden:
fail();
// or
fail("oh dear");
Dies bedeutet im Wesentlichen, dass ich nicht mehr überall werfen muss. Ich kann auch weiterhin die Ausnahme mit dem Namen "fail" abfangen. Es scheint sicherlich zu funktionieren, aber lässt mich mit dem Verdacht, dass ich diese Wahl später bereuen könnte.
Danke
bearbeiten: Gedanken etwas mehr über das Verhalten.
1/Wurf * diese entweder eine Kopie * dies machen wird oder es bewegen, wenn dies als Freiwild für die Kopie elision zählt, so Brennen der Destruktor von logic_error ist kein Problem
2/The Standardkopiekonstruktor einer Klasse ohne Mitglieder ist wahrscheinlich nur der Kopierkonstruktor der Basis, also kann wahrscheinlich das kopieren
3/Die Kopie von * diese, die über die Ausnahme zurückgegeben wird, hat wahrscheinlich undefinierte Werte für alle Mitglieder, die sind nicht in der Initialisierungsliste gesetzt
4/Elementfunktionen können während des Aufbaus aufgerufen werden. Der (Standard) Kopierkonstruktor ist eine Elementfunktion und kann daher während der Konstruktion aufgerufen werden. throw * Dies ruft den Kopierkonstruktor auf. Deshalb glaube ich, noch der Code legal ist
Was über das Schreiben 'throw' so schlecht ist? Ich kann nicht glauben, dass Sie all das durchgehen, nur um den Code schwerer lesbar zu machen. –
Das Hauptproblem, das ich sehe, ist, dass Sie die Tatsache verbergen, dass Sie eine Ausnahme von den Menschen, die Ihren Code lesen, werfen. –
Wenn Sie wirklich vermeiden wollen, throw immer und immer wieder zu wiederholen, sollten Sie Ihre Fehlerbehandlungsanmeldung in eine * Funktion höherer Ordnung * einbetten, die ** den gesamten Fehlerbehandlungsablauf enthält. Entweder abstrahiere alles oder nichts davon. –