<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wozu braucht man exceptionsichere assignment Operatoren?]]></title><description><![CDATA[<p>Hat jemand ein realistisches Beispiel, bei dem er nach einer Exception noch mit dem Objekt weiter arbeitet?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/263567/wozu-braucht-man-exceptionsichere-assignment-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Sat, 05 Sep 2026 13:44:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/263567.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 22 Mar 2010 19:51:59 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 19:51:59 GMT]]></title><description><![CDATA[<p>Hat jemand ein realistisches Beispiel, bei dem er nach einer Exception noch mit dem Objekt weiter arbeitet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872684</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Mon, 22 Mar 2010 19:51:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 20:01:17 GMT]]></title><description><![CDATA[<p>Meistens gehts nicht ums weiterarbeiten, sondern darum, einen definierten Zustand zu haben, in dem man die Objekte wieder sauber abräumen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872686</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872686</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 22 Mar 2010 20:01:17 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 20:03:19 GMT]]></title><description><![CDATA[<p>Jeder Fall wo überhaupt mit Exceptions gearbeitet wird? Exceptions sind zur Fehler<strong>behandlung</strong> und nicht bloß dazu, eine Fehlermeldung anzuzeigen. Und dabei ist es doch recht nützlich, wenn das alte Objekt noch seinen Ursprungszustand hat.</p>
<p>Software wird tatsächlich auch in der realen Wirtschaft genutzt (oho, wer hätte das gedacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /> ) und da darf ein Programm eben nicht einfach so abstürzen oder Daten verlieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872687</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872687</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 22 Mar 2010 20:03:19 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 20:16:21 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Meistens gehts nicht ums weiterarbeiten, sondern darum, einen definierten Zustand zu haben, in dem man die Objekte wieder sauber abräumen kann.</p>
</blockquote>
<p>Klingt eigentlich logisch, aber inwiefern ist dann sicher gestellt, dass die temporäre Kopie sauber abgeräumt werden kann, wenn beim Kopieren eine Exception auftritt (unter der Annahme man verwendet Copy&amp;Swap)?</p>
<p>SeppJ: Dein Zeug geht ziemlich an meiner Frage vorbei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872690</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872690</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Mon, 22 Mar 2010 20:16:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 20:22:34 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>pumuckl schrieb:</p>
<blockquote>
<p>Meistens gehts nicht ums weiterarbeiten, sondern darum, einen definierten Zustand zu haben, in dem man die Objekte wieder sauber abräumen kann.</p>
</blockquote>
<p>Klingt eigentlich logisch, aber inwiefern ist dann sicher gestellt, dass die temporäre Kopie sauber abgeräumt werden kann, wenn beim Kopieren eine Exception auftritt (unter der Annahme man verwendet Copy&amp;Swap)?</p>
</blockquote>
<p>Welche temporäre Kopie? Die des Exception Objektes? Die sollte keine Exception werfen können, sonst kann man ein Problem haben ja.</p>
<p>Wenn es um das werfende Objekt geht, dann ist das ja deine Aufgabe zu sorgen, dass das Objekt, wenn es eine Exception wirft in einem korrekten Zustand ist. Ob es dann korrekt zerstört werden kann ist eine andere Frage (kann es das denn, wen keien Exception geworfen wurde?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872694</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872694</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 22 Mar 2010 20:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 20:24:45 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Klingt eigentlich logisch, aber inwiefern ist dann sicher gestellt, dass die temporäre Kopie sauber abgeräumt werden kann, wenn beim Kopieren eine Exception auftritt (unter der Annahme man verwendet Copy&amp;Swap)?</p>
</blockquote>
<p>Naja, ein op= der nur aus Copy&amp;Swap besteht, hat einen Punkt, wo es ne Exception geben kann - im Copy-Teil. Und wenn beim Ctor eine Exception auftritt hat das temporäre Objekt nie existiert. Natürlich muss auch der Copy-Ctor dann exceptionsicher sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872695</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 22 Mar 2010 20:24:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 21:01:59 GMT]]></title><description><![CDATA[<p>Mach ich was falsch? Ich hab jetzt ein bisschen rum probiert aber für die Objekte die im Copy-Ctor erstellt werden, wird nicht mal mehr der Dtor aufgerufen, wenn die Exception fliegt.</p>
<pre><code class="language-cpp">int n = 0;

class Ex
{
public:
	Ex()
	{
		std::cout&lt;&lt;&quot;Ex constr...\n&quot;;
		n++;
		if(n==4)
		{
			std::cout&lt;&lt;&quot;throw\n&quot;;
			throw 1;
		}
	}
	~Ex()
	{
		std::cout&lt;&lt;&quot;Ex destr...\n&quot;;
	}

};

class Foo
{
public:
	Foo()
		: e1( NULL)
		, e2( NULL)
	{
		std::cout&lt;&lt;&quot;Foo constr...\n&quot;;
		e1 = new Ex();
		e2 = new Ex();
	}

	Foo( Foo const&amp; of)
		: e1( NULL)
		, e2( NULL)
	{
		std::cout&lt;&lt;&quot;Foo copy constr...\n&quot;;
		e1 = new Ex();
		e2 = new Ex();
	}

	~Foo()
	{
		std::cout&lt;&lt;&quot;Foo destr...\n&quot;;
		delete e1;
		delete e2;
	}
private:
	Ex* e1;
	Ex* e2;
};

int main()
{
	try
	{
		Foo f;
		Foo f2(f);
	}
	catch(...)
	{
		std::cout&lt;&lt;&quot;catch\n&quot;;
	}
}

}
</code></pre>
<blockquote>
<p>Foo constr...<br />
Ex constr...<br />
Ex constr...<br />
Foo copy constr...<br />
Ex constr...<br />
Ex constr...<br />
throw<br />
Foo destr...<br />
Ex destr...<br />
Ex destr...<br />
catch</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1872716</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872716</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Mon, 22 Mar 2010 21:01:59 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 21:21:02 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Mach ich was falsch? Ich hab jetzt ein bisschen rum probiert aber für die Objekte die im Copy-Ctor erstellt werden, wird nicht mal mehr der Dtor aufgerufen, wenn die Exception fliegt.</p>
</blockquote>
<p>Wenn im Ctor eine Exception fliegt wurde das Objekt nie komplett konstruiert -&gt; es gibt auch nichts wofür man einen Dtor aufrufen kann. Die Lebenszeit eines Objektes beginnt eben erst bei Verlassen des Ctors und endet bei Eintritt in den Dtor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872727</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872727</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 22 Mar 2010 21:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Mon, 22 Mar 2010 21:26:05 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Mach ich was falsch? Ich hab jetzt ein bisschen rum probiert aber für die Objekte die im Copy-Ctor erstellt werden, wird nicht mal mehr der Dtor aufgerufen, wenn die Exception fliegt.</p>
</blockquote>
<p>Die Objekte (e1, e2) wurden mit new erstellt, liegen also nicht im automatischen Speicherbereich, erwarte keine Wunder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /><br />
Dass der zweite Foo-Destruktor nicht aufgerufen wird liegt daran, dass noch f2 ja noch nicht fertig konstruiert war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1872731</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1872731</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Mon, 22 Mar 2010 21:26:05 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 19:08:33 GMT]]></title><description><![CDATA[<p>Dann bringt Copy&amp;Swap beim Aufräumen aber auch nicht viel, sondern lässt das Problem im Copy-Ctor.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873053</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Tue, 23 Mar 2010 19:08:33 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 19:10:28 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Dann bringt Copy&amp;Swap beim Aufräumen aber auch nicht viel, sondern lässt das Problem im Copy-Ctor.</p>
</blockquote>
<p>Irgendwo muss die Verantwortung liegen. Copy&amp;Swap bedeutet: hier liegt sie nicht.</p>
<p>Aber im Prinzip ists recht trivial: RAII und gut ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873054</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873054</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 23 Mar 2010 19:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 20:10:32 GMT]]></title><description><![CDATA[<p>Mit RAII ist aber das Aufräumen auch ohne Copy&amp;Swap kein großes Problem mehr.</p>
<p>Und was machst du außerdem, wenn du eine 3rd Party Klasse als Member hast, aber diese kein non-throwing swap anbietet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873072</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Tue, 23 Mar 2010 20:10:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 20:19:52 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Mit RAII ist aber das Aufräumen auch ohne Copy&amp;Swap kein großes Problem mehr.</p>
</blockquote>
<p>RAII und Copy&amp;Swap haben nichts miteinander zu tun. swap erlaubt dir commits zu haben, was essentiell für exception sicheren code ist. unabhängig ob du raii hast oder nicht. raii dagegen räumt auf.</p>
<p>implementiere mal einen komplexen operator= nur mit raii ohne swap. ist sobald du 2 member hast wo eine zuweisen werfen kann nicht mehr trivial möglich.</p>
<p>bsp:</p>
<pre><code class="language-cpp">class Person {
  string vorname;
  string nachname;
 //...
  Person&amp; operator=(Person const&amp; other) {
    nachname = other.nachname;
    try {
      vorname = other.vorname;
    } catch(...) {
      //was nun??
      throw;
    }
  }
};
</code></pre>
<blockquote>
<p>Und was machst du außerdem, wenn du eine 3rd Party Klasse als Member hast, aber diese kein non-throwing swap anbietet?</p>
</blockquote>
<p>ragequitten.</p>
<p>wenn das wirklich der fall ist, dann muss man diese klasse in einen scoped_ptr packen und hoffen dass das irgendwer mal patcht.</p>
<p>es gibt keinen grund warum man kein swap anbieten könnte wenn das objekt kopierbar ist. deshalb kann man es meistens trivial nachpatchen. wenn das nicht geht, dann eben scoped_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873078</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 23 Mar 2010 20:19:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 20:49:15 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>antenna schrieb:</p>
<blockquote>
<p>Mit RAII ist aber das Aufräumen auch ohne Copy&amp;Swap kein großes Problem mehr.</p>
</blockquote>
<p>RAII und Copy&amp;Swap haben nichts miteinander zu tun. swap erlaubt dir commits zu haben, was essentiell für exception sicheren code ist. unabhängig ob du raii hast oder nicht. raii dagegen räumt auf.</p>
<p>implementiere mal einen komplexen operator= nur mit raii ohne swap. ist sobald du 2 member hast wo eine zuweisen werfen kann nicht mehr trivial möglich.</p>
<p>...</p>
</blockquote>
<p>Ich weiß worum es geht und darum auch meine Ausgangsfrage: &quot;Hat jemand ein realistisches Beispiel, bei dem er nach einer Exception noch mit dem Objekt weiter arbeitet?&quot; Das einzige Beispiel was bis jetzt kam war &quot;die Objekte wieder sauber abräumen&quot;, was aber nur in den Copy-Ctor mit RAII verschoben wird. Und meine Ausgangsfrage ist immer noch offen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873083</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Tue, 23 Mar 2010 20:49:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Tue, 23 Mar 2010 21:22:13 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Ich weiß worum es geht und darum auch meine Ausgangsfrage: &quot;Hat jemand ein realistisches Beispiel, bei dem er nach einer Exception noch mit dem Objekt weiter arbeitet?&quot; Das einzige Beispiel was bis jetzt kam war &quot;die Objekte wieder sauber abräumen&quot;, was aber nur in den Copy-Ctor mit RAII verschoben wird. Und meine Ausgangsfrage ist immer noch offen.</p>
</blockquote>
<p>exception im operator= oder generell?<br />
der operator= ist natürlich etwas sehr kritisches, wenn der fehlschlägt ist die chance dass du mit dem objekt noch viel machen kannst eher gering. denn der grund warum ein op= fehlschlägt ist idr ein gravierender.</p>
<p>weiter arbeiten muss man aber aufjedenfall im dtor. das ist immer der fall. meistens macht man dann ein rollback der letzten aktionen (copy&amp;swap ftw).</p>
<p>aber ich verstehe generell nicht warum du dich so darauf versteifst. imho ist das einfach eine komplett falsche fragestellung die am kern des themas komplett vorbei geht. beispiele für einen op= der fehlschlägt zu liefern ist nicht das problem, das problem ist dein verständnis eines &quot;weiter arbeitens&quot;.</p>
<p>stell dir einfach ein objekt vor, dass du serialisierst und du willst es kopieren. irgendwas geht dabei schief und du musst es nachher natürlich wieder serialisieren. wenn da das objekt in keinem gültigen zustand ist, ist deine anwendung bis zur nächsten neuinstallation defekt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873094</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 23 Mar 2010 21:22:13 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 19:41:00 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>stell dir einfach ein objekt vor, dass du serialisierst und du willst es kopieren. irgendwas geht dabei schief und du musst es nachher natürlich wieder serialisieren. wenn da das objekt in keinem gültigen zustand ist, ist deine anwendung bis zur nächsten neuinstallation defekt.</p>
</blockquote>
<p>In Code übersetzt würde das z.B. so aussehen.</p>
<pre><code class="language-cpp">Objekt o = load();
	Objekt newO = getNew();
	try 
	{
		o = newO;
	}
	catch(...) 
	{
	}
	save(o); //Dank Copy&amp;Swap können wir hier speichen, da wir auf jeden Fall ein gültiges Objekt haben, egal ob in der Zuweisung was scheif ging.
</code></pre>
<p>Aber wer programmiert denn so?<br />
Eigentlich programmiert man doch so, dass garnicht erst gespeichert wird, wenn was schief ging.</p>
<pre><code class="language-cpp">Objekt o = load();
	Objekt newO = getNew();
	o = newO; // Wenn hier eine Exception fliegt, wird save nie aufgerufen
	save(o);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1873524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873524</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Wed, 24 Mar 2010 19:41:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 19:45:45 GMT]]></title><description><![CDATA[<p>Was ist aber, wenn du z.B eine sinnvolle Loginausgabe machen willst des Objektes, welches eine Exception geworfen hat?<br />
Oder um bei dem Beispiel des Speicherns zu bleiben: Du bearbeitest z.B gerade ein Dokument und irgendwas geht schief und aus irgendeinem Grund muss das Programm beendet werden. Jetzt kannst du schön den Fehler abfangen und kurz speichern oder mal eben den User fragen, was er machen möchte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873525</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 24 Mar 2010 19:45:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 20:02:09 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Was ist aber, wenn du z.B eine sinnvolle Loginausgabe machen willst des Objektes, welches eine Exception geworfen hat?</p>
</blockquote>
<p>Ja, logging des alten Zustandes kann nur funktionieren, wenn man nen exceptionsicheren assignment Operator hat. Aber sein mal ehrlich, wie oft hast du nur um eine Zuweisung ein try-catch gemacht, um dann zu loggen?</p>
<blockquote>
<p>Oder um bei dem Beispiel des Speicherns zu bleiben: Du bearbeitest z.B gerade ein Dokument und irgendwas geht schief und aus irgendeinem Grund muss das Programm beendet werden. Jetzt kannst du schön den Fehler abfangen und kurz speichern oder mal eben den User fragen, was er machen möchte.</p>
</blockquote>
<p>Das &quot;irgendwas geht schief&quot; ist schon wieder viel zu ungenau. Es geht ja um Exceptions im Assignment Operator. Mach doch mal ein realistisches Codebeispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873534</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873534</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Wed, 24 Mar 2010 20:02:09 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 20:20:00 GMT]]></title><description><![CDATA[<p>Shade hat ja bereits etwas zu dem Operator gesagt:</p>
<p>Shade Of Mine  schrieb:</p>
<blockquote>
<p>der operator= ist natürlich etwas sehr kritisches, wenn der fehlschlägt ist die chance dass du mit dem objekt noch viel machen kannst eher gering. denn der grund warum ein op= fehlschlägt ist idr ein gravierender.</p>
</blockquote>
<p>Ich bin daher von der grundsätzlichen Variante ausgegangen..</p>
<p>Realistisch ist imo so etwas:</p>
<pre><code class="language-cpp">Object o;
try
{
  //...
  o.try_something_that_might_throw ();
  //...
}
catch (...)
{
 // ok ging wohl nicht..
 cout &lt;&lt; o.debug_information (); // was für den Entwickler
 save_states_to_file ( o.get_states () ); // und was für den User
}
</code></pre>
<p>So in etwa mache ich das auch, wenn ich lokaler etwas behandeln kann.</p>
<p>Das war ja deine ursprüngliche Frage, oder nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873544</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 24 Mar 2010 20:20:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 21:22:41 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Ja, logging des alten Zustandes kann nur funktionieren, wenn man nen exceptionsicheren assignment Operator hat. Aber sein mal ehrlich, wie oft hast du nur um eine Zuweisung ein try-catch gemacht, um dann zu loggen?</p>
</blockquote>
<p>Nicht um die Zuweisung. Aber um eine andere Operation. Die muss auch exceptionsicher sein. Und das geht nur wenn die verwendeten Operationen exceptionsicher sind, unter anderem die verwendeten op=</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873579</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873579</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 24 Mar 2010 21:22:41 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 21:46:30 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Realistisch ist imo so etwas:</p>
<pre><code class="language-cpp">Object o;
try
{
  //...
  o.try_something_that_might_throw ();
  //...
}
catch (...)
{
 // ok ging wohl nicht..
 cout &lt;&lt; o.debug_information (); // was für den Entwickler
 save_states_to_file ( o.get_states () ); // und was für den User
}
</code></pre>
<p>So in etwa mache ich das auch, wenn ich lokaler etwas behandeln kann.</p>
<p>Das war ja deine ursprüngliche Frage, oder nicht?</p>
</blockquote>
<p>Ne, ich seh gerade, dass die Frage auch etwas schlecht gestellt ist, weil sie nur im Zusammenhang mit dem Threadtitel Sinn macht. Es geht um Beispiele wozu man exceptionsichere assignment Operatoren braucht, um dann noch das korrekte alte Objekt zu haben, obwohl eine Exception beim Zuweisen geflogen ist.</p>
<p>Mir ist ein Beispiel eingefallen das möglich wäre, aber dass ich auch nicht für sehr realistisch halte.<br />
Man möchte z.B. eine state machine die immer den alten Zustand behält, wenn man den neuen Zustand nicht schalten kann.</p>
<pre><code class="language-cpp">try
{
    m_currentState = m_stateA;
}
catch(...)
{
   log(&quot;State change failed, old state remains. &quot;)
}
</code></pre>
<p>Aber warum sollte man immer ein ganzes Objekt kopieren um einen State zu schalten. Einfach nur nen Pointer umsetzen wäre viel performanter und dabei kann auch keine Exception fliegen. Und bei welchem Anwendungsfall will man schon immer den alten State behalten?</p>
<p>Die einzigen Sachen die mir einfallen, die exceptionsichere assignment Operatoren haben sollten, sind Libraries die praktisch für alles verwendet werden können. Da könnte ja mal jemand ein Anwendungsfall einfallen, wo er das braucht. Was aber nicht meine Frage nach so einem Anwendungsfall beantwortet. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>pumuckl schrieb:</p>
<blockquote>
<p>antenna schrieb:</p>
<blockquote>
<p>Ja, logging des alten Zustandes kann nur funktionieren, wenn man nen exceptionsicheren assignment Operator hat. Aber sein mal ehrlich, wie oft hast du nur um eine Zuweisung ein try-catch gemacht, um dann zu loggen?</p>
</blockquote>
<p>Nicht um die Zuweisung. Aber um eine andere Operation. Die muss auch exceptionsicher sein. Und das geht nur wenn die verwendeten Operationen exceptionsicher sind, unter anderem die verwendeten op=</p>
</blockquote>
<p>Du hast also eine Operation bei der du ein Objekt übergibst und weist dem was zu und wenn eine Exception vor oder während dem Zuweisen fliegt, willst du den alten Zustand loggen, wenn die Exception später fliegt, willst du den neu zugewiesenen Zustand loggen? Oder meinst du was anderes? Mach einfach ein Codebeispiel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873590</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Wed, 24 Mar 2010 21:46:30 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 22:14:12 GMT]]></title><description><![CDATA[<p>Naja, so was gibt es schon öfters:</p>
<pre><code class="language-cpp">while(obj.isValid()) {
    obj.machWas();
    obj = obj.next();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1873599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873599</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Wed, 24 Mar 2010 22:14:12 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Wed, 24 Mar 2010 22:27:45 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Es geht um Beispiele wozu man exceptionsichere assignment Operatoren braucht, um dann noch das korrekte alte Objekt zu haben, obwohl eine Exception beim Zuweisen geflogen ist.</p>
</blockquote>
<p>Die Notwendigkeit, Zuweisungsoperatoren exceptionsicher zu gestalten, findest du bereits in grundlegendsten Algorithmen. Nimm <code>std::copy()</code> . Diese Funktion bietet die Basis-Exceptionsicherheit (komplettes Rollback ist nicht möglich, aber es muss nach wie vor ein gültiger Zustand herrschen, d.h. keine halben Objekte). Um dies zu bewerkstelligen, muss das Element, dessen Zuweisung eine Exception wirft, unbedingt im alten Zustand bleiben.</p>
<p>Oder sag mir, wie du <code>std::copy()</code> implementierst, wenn der Zuweisungsoperator nicht exceptionsicher ist. Die Funktion <code>copy()</code> ist übrigens bei Weitem kein Einzelfall, in der STL findest du viele ähnliche Beispiele.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873603</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 24 Mar 2010 22:27:45 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Thu, 25 Mar 2010 22:34:06 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>antenna schrieb:</p>
<blockquote>
<p>Es geht um Beispiele wozu man exceptionsichere assignment Operatoren braucht, um dann noch das korrekte alte Objekt zu haben, obwohl eine Exception beim Zuweisen geflogen ist.</p>
</blockquote>
<p>Die Notwendigkeit, Zuweisungsoperatoren exceptionsicher zu gestalten, findest du bereits in grundlegendsten Algorithmen. Nimm <code>std::copy()</code> . Diese Funktion bietet die Basis-Exceptionsicherheit (komplettes Rollback ist nicht möglich, aber es muss nach wie vor ein gültiger Zustand herrschen, d.h. keine halben Objekte). Um dies zu bewerkstelligen, muss das Element, dessen Zuweisung eine Exception wirft, unbedingt im alten Zustand bleiben.</p>
<p>Oder sag mir, wie du <code>std::copy()</code> implementierst, wenn der Zuweisungsoperator nicht exceptionsicher ist. Die Funktion <code>copy()</code> ist übrigens bei Weitem kein Einzelfall, in der STL findest du viele ähnliche Beispiele.</p>
</blockquote>
<p>Gerade das, was es nicht kann, nämlich den ganzen Rollback, wäre das interessante. Und zu solchen Libraries ahb ich ein paar Zeilen weiter unten schon was gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873980</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873980</guid><dc:creator><![CDATA[antenna]]></dc:creator><pubDate>Thu, 25 Mar 2010 22:34:06 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Thu, 25 Mar 2010 22:48:32 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Gerade das, was es nicht kann, nämlich den ganzen Rollback, wäre das interessante.</p>
</blockquote>
<p>Das ist nun mal nicht sinnvoll möglich, zumindest nicht bei der Generizität.</p>
<p>Ich habe dir ein Beispiel für &quot;wozu man exceptionsichere assignment Operatoren braucht, um dann noch das korrekte alte Objekt zu haben, obwohl eine Exception beim Zuweisen geflogen ist&quot; gebracht. Ich bezog mich dabei auf das einzelne Element und nicht auf die Sequenz als Ganzes. Wenn dir das nicht ausreicht, musst du schon konkreter werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1873986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1873986</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Mar 2010 22:48:32 GMT</pubDate></item><item><title><![CDATA[Reply to Wozu braucht man exceptionsichere assignment Operatoren? on Fri, 26 Mar 2010 06:45:22 GMT]]></title><description><![CDATA[<p>antenna schrieb:</p>
<blockquote>
<p>Gerade das, was es nicht kann, nämlich den ganzen Rollback, wäre das interessante.</p>
</blockquote>
<p>Eine Operation, in der mehrere Suboperationen Exceptions werfen können, ist per sé nicht garantiert rollbackfähig. Wenn eine Operation ohne nothrow-Garantie abgeschlossen ist, kann sie nicht mit nothrow-Garantie rückgängig gemacht werden, mit Ausnahme von werfenden Konstruktor-artigen Operationen (inklusive Ressourcenacquisition), da Destruktoren und Ressourcenfreigabe grundsätzlich nicht werfen sollen.</p>
<p>Ein std::copy rollbackfähig zu gestalten bräuchte daher eine zwischengeschaltete temporäre Operation, die das Ziel nicht verändert, also eine temporäre Sequenz vom gleichen Typ wie die Zielsequenz, so dass erst kopiert und dann die komplette Sequenz geswappt werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1874029</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1874029</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 26 Mar 2010 06:45:22 GMT</pubDate></item></channel></rss>