<?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[Exception]]></title><description><![CDATA[<p>Hallo,</p>
<p>was ist damit gemeint, eine Exception fangen und<br />
dann rethrow also nochmal werfen ??</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/270413/exception</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 09:20:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/270413.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 12 Jul 2010 08:43:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 08:43:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>was ist damit gemeint, eine Exception fangen und<br />
dann rethrow also nochmal werfen ??</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924894</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924894</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 12 Jul 2010 08:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 08:48:20 GMT]]></title><description><![CDATA[<p>Strapazier die Hilfbereitschaft der Forenmitglieder nicht über...</p>
<p><a href="http://www.lmgtfy.com/?q=rethrow+exception+c%2B%2B" rel="nofollow">http://www.lmgtfy.com/?q=rethrow+exception+c%2B%2B</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924897</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924897</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 08:48:20 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 08:50:47 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Kurzes Beispiel:</p>
<pre><code class="language-cpp">try {
  int i = 5 / 0;  // Fehleranfaelliger Code
}
catch( bad_exception exc ) {  // 1te mal gefangen
  throw;  // Direktes weiterwerfen
}
catch( ... ) {  // alles was beim ersten mal nicht &quot;gefangen&quot; wurde, fangen wir hier
  throw MyException(exc);  // Weiterwerfen mit neuem ExceptionTyp
}
</code></pre>
<p>Das fangen bedeutet einfach nur, das man eine Exception nicht bis zum Betriebssystem durchlässt, sondern selber auf den Fehler regiert.</p>
<p>Mit weiterwerfen ist häufig einfach nur gemeint, das wenn man bestimmte Exception zwar auffängt, aber diese selber nicht verabeiten möchte/sollte, sonder diese min. eine Funktion nach oben gibt wo dann ein globales Exception-Handling vorhanden ist. Oder die Exception in einen anderen Typ packt, so das zB: die aufrufende Funktion nur auf einen bestimmten Typ achten muss.</p>
<p>Mfg marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924898</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924898</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Mon, 12 Jul 2010 08:50:47 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 08:54:02 GMT]]></title><description><![CDATA[<p>Wenn ein catch-Block feststellt<br />
a) dass die Exception die er gefangen hat eigentlich an eine höhere Stelle gehen soll<br />
b) Er keine Ahnung hat, was er da gerade gefangen hat</p>
<p>Dann bietet es sich an die gleiche Exception einfach noch einmal zu werfen.</p>
<p>Was ich mir vorstellen könnte, wäre ein einfaches try-catch um eine Eingabeoperation, welches Logikfehler abfängt (zum Beispiel Buchstaben eingegeben statt einer Zahl). Aber wenn bei der Eingabeoperation mal wirklich was schief geht (Tastatur fängt Feuer), dann ist dieser Block damit überfordert und gibt das Problem besser weiter. Vielleicht gibt es weiter oben in der Programmlogik einen Catch-Block für Hardwaredefekte, der dann den Feuerlöscher aktivieren kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924899</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Jul 2010 08:54:02 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 09:00:46 GMT]]></title><description><![CDATA[<p>Marc-O schrieb:</p>
<blockquote>
<pre><code class="language-cpp">catch( bad_exception exc ) {  // 1te mal gefangen
  throw;  // Direktes weiterwerfen
}
</code></pre>
</blockquote>
<p>Dann fang aber auch Referenzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
catch( bad_exception**&amp;** exc )</p>
<pre><code class="language-cpp">catch( bad_exception&amp; exc ) {  // 1te mal gefangen
  throw;  // Direktes weiterwerfen
}
</code></pre>
<p>EDIT:<br />
Eigentlich sogar const Referenzen<br />
catch( <strong>const</strong> bad_exception**&amp;** exc )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924901</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924901</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 09:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 09:05:54 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Marc-O schrieb:</p>
<blockquote>
<pre><code class="language-cpp">catch( bad_exception exc ) {  // 1te mal gefangen
  throw;  // Direktes weiterwerfen
}
</code></pre>
</blockquote>
<p>Dann fang aber auch Referenzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
catch( bad_exception**&amp;** exc )</p>
<pre><code class="language-cpp">catch( bad_exception&amp; exc ) {  // 1te mal gefangen
  throw;  // Direktes weiterwerfen
}
</code></pre>
<p>EDIT:<br />
Eigentlich sogar const Referenzen<br />
catch( <strong>const</strong> bad_exception**&amp;** exc )</p>
</blockquote>
<p>Okay okay <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> vergess es jedesmal wieder ;). Werds mir aber merken.</p>
<p>Mfg marco</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924908</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924908</guid><dc:creator><![CDATA[Marc-O]]></dc:creator><pubDate>Mon, 12 Jul 2010 09:05:54 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 12:00:58 GMT]]></title><description><![CDATA[<p>wie gehts das überhaupt vonstatten.</p>
<p>Wenn ich mehrere catch Blöcke habe. Liest der Compiler von oben nach unten<br />
und nimmt den erstbesten der passen könnte ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924992</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924992</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 12 Jul 2010 12:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 12:10:43 GMT]]></title><description><![CDATA[<p>blurry333 schrieb:</p>
<blockquote>
<p>wie gehts das überhaupt vonstatten.</p>
<p>Wenn ich mehrere catch Blöcke habe. Liest der Compiler von oben nach unten<br />
und nimmt den erstbesten der passen könnte ?</p>
</blockquote>
<p>Was meinst du? Es gibt nur Verschachtelungen. Und da kommt dann als erstes der in der passenden Schachtelungsebene dran.</p>
<pre><code class="language-cpp">try  // Äußerer Block
{

  // Anweisungen im äußeren Block

  try 
   {
      // Innerer Block A
   }
   catch(...)
   {
     // Fehlerbehandlung von Block A
   }

  // mehr Anweisungen im äußeren Block

  try 
   {
      // Innerer Block B
   }
   catch(...)
   {
     // Fehlerbehandlung von Block B
   }

  // noch mehr Anweisungen im äußeren Block

}
catch (...)
{
 // Catch vom äußeren Block
}
</code></pre>
<p>Wird bei irgendwelchen Anweisungen im äußeren Block etwas geworfen, wird im äußeren Block gefangen.</p>
<p>Wird in Block A geworfen, wird in Block A gefangen.</p>
<p>Wird in Block B geworfen, wird in Block B gefangen.</p>
<p>Wird in der Fehlerbehandlung von Block A geworfen (z.B. ein rethrow), dann wird vom äußeren Block gefangen.</p>
<p>Wird in der Fehlerbehandlung von Block B geworfen, dann wird vom äußeren Block gefangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1924997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1924997</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 12 Jul 2010 12:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 12:39:05 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>blurry333 schrieb:</p>
<blockquote>
<p>wie gehts das überhaupt vonstatten.</p>
<p>Wenn ich mehrere catch Blöcke habe. Liest der Compiler von oben nach unten<br />
und nimmt den erstbesten der passen könnte ?</p>
</blockquote>
<p>Was meinst du? Es gibt nur Verschachtelungen.</p>
</blockquote>
<p>Nein, es ist möglich, mehrere catch-Blöcke zu schreiben:</p>
<pre><code class="language-cpp">try
{
    ...
}
catch(int i)
{
    ...
}
catch(char* str)
{
    ...
}
catch(const FileNotFoundException&amp; e)
{
    ...
}
catch(const std::exception&amp; e)
{
    ...
}
catch(...)
{
    ...
}
</code></pre>
<p>Und um die Frage zu beantworten: Ja, der Compiler nimmt den ersten passenden Block. Das heißt, wenn man z.B. den ...-Block als erstes nehmen würde, würde dieser immer genommen werden und die anderen hätten keine Wirkung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925024</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925024</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 12 Jul 2010 12:39:05 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 14:17:40 GMT]]></title><description><![CDATA[<p>also die Ausnahme wird behandelt und dann aufgrund des am Ende stehenden<br />
throw nochmal geworfen und von einer anderen Klasse behandelt ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925073</guid><dc:creator><![CDATA[blurry333]]></dc:creator><pubDate>Mon, 12 Jul 2010 14:17:40 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 14:35:37 GMT]]></title><description><![CDATA[<p>Die Exception wird &quot;eine Ebene höher&quot; geschickt. Das wäre vom Resultat wie, als würde der try-catch-Block gar nicht existieren, blos dass eben vorher noch die Anweisungen im catch-Block ausgeführt werden. Das kann nötig sein, wenn man in einer Funktion noch z.B. Resourcen freigeben muss, die eigentliche Exception aber nicht behandeln kann. Beispiel:</p>
<pre><code class="language-cpp">void crazy_func()
{
    int *needed_array = new int[rand()%1000 + 2000];
    try
    {
        // Tue irgendwas, was eventuell eine Exception werfen könnte

        // Aufräumen (an dieser Stelle kommt man nur an, wenn es keine Exception gab)
        delete[] needed_array;
    }
    catch(...)
    {
        // Aufräumen im Falle einer Exception
        delete[] needed_array;

        // eigentliche Exception kann in dieser Funktion nicht behandelt werden, also weiter an Aufrufer werfen
        throw;
    }
}
</code></pre>
<p>Mit RAII kann man viele dieser Fälle vermeiden. Das Beispiel könnte auch so aussehen:</p>
<pre><code class="language-cpp">void crazy_func()
{
    boost::scoped_array&lt;int&gt; needed_array(new int[rand()%1000 + 2000]);
    // Tue irgendwas, was eventuell eine Exception werfen könnte, diesmal ohne try-catch-Block
}   // das Array wird automatisch freigegeben, egal ob es eine Exception gab oder nicht
</code></pre>
<p>Vom Effekt her ist das 2. Beispiel identisch, die Exception wird an den Aufrufer weitergegeben, weil sie innerhalb der Funktion nicht behandelt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925081</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925081</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Mon, 12 Jul 2010 14:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 14:38:30 GMT]]></title><description><![CDATA[<p>ipsec schrieb:</p>
<blockquote>
<p>[...]<br />
Mit RAII kann man viele dieser Fälle vermeiden. Das Beispiel könnte auch so aussehen:</p>
<pre><code class="language-cpp">void crazy_func()
{
    boost::scoped_array&lt;int&gt; needed_array(new int[rand()%1000 + 2000]);
    // Tue irgendwas, was eventuell eine Exception werfen könnte, diesmal ohne try-catch-Block
}   // das Array wird automatisch freigegeben, egal ob es eine Exception gab oder nicht
</code></pre>
</blockquote>
<p>Oder gleich so:</p>
<pre><code class="language-cpp">void crazy_func()
{
    std::vector&lt;int&gt; needed_array(rand()%1000 + 2000);
    // Tue irgendwas, was eventuell eine Exception werfen könnte, diesmal ohne try-catch-Block
}   // das Array wird automatisch freigegeben, egal ob es eine Exception gab oder nicht
</code></pre>
<p>PS: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925082</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 12 Jul 2010 14:38:30 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 15:44:19 GMT]]></title><description><![CDATA[<p>Warum fangt ihr const? Wenn ich ne Exception weiterwerfe, will ich ihr meistens weitere Informationen mit auf den Weg geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925119</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 15:44:19 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 15:52:14 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Warum fangt ihr const? Wenn ich ne Exception weiterwerfe, will ich ihr meistens weitere Informationen mit auf den Weg geben.</p>
</blockquote>
<p>Klar möchte ich auch weitere Informationen, allerdings (i. d. R.) nur<br />
Informationen und keine Sachen, die das Objekt verändern.</p>
<p>Wenn du natürlich in der Exception nen Counter hast, wie oft sie<br />
schon weitergeworfen wurde und den erhöhst, brauchst du eine non-const Referenz</p>
<p>Gegenfrage: Wann verwendest du const-Referenzen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925123</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925123</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 15:52:14 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 16:14:43 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Warum fangt ihr const? Wenn ich ne Exception weiterwerfe, will ich ihr meistens weitere Informationen mit auf den Weg geben.</p>
</blockquote>
<p>Klar möchte ich auch weitere Informationen, allerdings (i. d. R.) nur<br />
Informationen und keine Sachen, die das Objekt verändern.</p>
</blockquote>
<p>Versteh ich nicht. Wenn ich dieselbe Exception weiterwerfen will (also ein pures &quot;throw;&quot; schreiben will) un dieser Exception weitere Informationen geben will, muss ich sie auch verändern.</p>
<blockquote>
<p>Gegenfrage: Wann verwendest du const-Referenzen?</p>
</blockquote>
<p>Nie, weil ich keinen Sinn darin sehe. Ich bekomm eh ne Kopie übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925136</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 16:14:43 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 16:59:00 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>CSpille schrieb:</p>
<blockquote>
<p>Michael E. schrieb:</p>
<blockquote>
<p>Warum fangt ihr const? Wenn ich ne Exception weiterwerfe, will ich ihr meistens weitere Informationen mit auf den Weg geben.</p>
</blockquote>
<p>Klar möchte ich auch weitere Informationen, allerdings (i. d. R.) nur<br />
Informationen und keine Sachen, die das Objekt verändern.</p>
</blockquote>
<p>Versteh ich nicht. Wenn ich dieselbe Exception weiterwerfen will (also ein pures &quot;throw;&quot; schreiben will) un dieser Exception weitere Informationen geben will, muss ich sie auch verändern.</p>
</blockquote>
<p>Korrekt! Aber veränderst du das Objekt in der Regel wirklich?<br />
Schreibst du weitere Infos in das Objekt oder veränderst vorhandene?<br />
Du holst dir meistens die Fehlermeldung und einen Error-Code<br />
oder kuckst dir evtl. noch andere Daten an.<br />
Ein Weiterwerfen ist wohl keine Veränderung des Objektes.<br />
und wenn mir das 'const' bei einer Fehleranalyse nur sagt:<br />
&quot;Don't worry, I won't change your object in this catch-block&quot;<br />
ist es für mich genug ein 'const' davor zu schreiben</p>
<p>Michael E. schrieb:</p>
<blockquote>
<blockquote>
<p>Gegenfrage: Wann verwendest du const-Referenzen?</p>
</blockquote>
<p>Nie, weil ich keinen Sinn darin sehe. Ich bekomm eh ne Kopie übergeben.</p>
</blockquote>
<p>Über diese Antwort bin ich etwas erstaunt, zumal sie von einem Benutzer mit<br />
3500 Beiträgen kommt.<br />
Ich rede von const-Referenzen im Allgemeinen, nicht im Zusammenhang mit Exceptions.<br />
Ich vermute das führte dich zu deiner Aussage 'Nie', oder?</p>
<p>Als Beispiel, dass du keine Kopie kriegst:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

class MyException{
public:
        int i;
        MyException(){i=0;}
        MyException(const MyException&amp; e){
                        std::cout &lt;&lt; &quot;create copy&quot; &lt;&lt; std::endl;
        }
};

int main() {
        try{
                try {
//                      MyException e;
//                      e.i=0;
//                      throw e;
                        throw MyException();
                }
                catch( MyException&amp; exc ) {
                        std::cout &lt;&lt; exc.i &lt;&lt; std::endl;
                        exc.i = 1;
                        throw;
                }
        }catch(MyException&amp; exc){
                std::cout &lt;&lt; exc.i &lt;&lt; std::endl;
        }
        return 0;
}
</code></pre>
<pre><code>0
1
</code></pre>
<p>Du kriegst (evtl.) eine Kopie von der Original-Exception,<br />
aber diese wird gemacht um das Objekt an einen sicheren Ort zu transferieren</p>
<p>EDIT: Das Objekt wird (bei meinem Compiler) zum Beispiel kopiert, wenn du<br />
die auskommentierte Version verwendest.<br />
EDIT2: Ich hab keine Ahnung, ob es beim Weiterschmeißen eine Garantie gibt,<br />
dass das Objekt nicht kopiert wird, jedoch sollte eine Kopie auch die veränderten<br />
Daten enthalten.</p>
<p>Gruß,<br />
CSpille</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925150</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 16:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 18:26:50 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Korrekt! Aber veränderst du das Objekt in der Regel wirklich?</p>
</blockquote>
<p>Manchmal.</p>
<blockquote>
<p>und wenn mir das 'const' bei einer Fehleranalyse nur sagt:<br />
&quot;Don't worry, I won't change your object in this catch-block&quot;<br />
ist es für mich genug ein 'const' davor zu schreiben</p>
</blockquote>
<p>Wem genau sagst du, dass sein Objekt nicht verändert wird? Es gibt nur zwei Fälle:</p>
<ol>
<li>Du wirfst ein Objekt, das schon vorher existiert hat. Dann wird garantiert eine Kopie beim ersten Werfen erstellt, sodass sich das Originalobjekt nicht ändern kann.</li>
<li>Ich erstelle extra ein Objekt, das ich dann durch die Gegend werfe.</li>
</ol>
<p>So oder so habe ich also in einem Catch-Block ein Objekt, das nur in Catch-Blöcken leben kann, es hat weder vor dem ersten Wurf gelebt, noch nach dem letzten Fangen. Nun ist es bei Catch-Blöcken so, dass ich nicht weitere Catch-Blöcke aufrufe wie man das bei normalen Funktionen macht, sondern ein &quot;Aufruf&quot; eines anderen Catch-Blocks bedeutet automatisch, dass der aufrufende Catchblock verlassen wird. Also bekommt der Aufrufer das Objekt nie mehr zu sehen, weshalb er sich nicht mehr für Veränderungen am Objekt interessieren kann. Welchen Sinn sollte dann also ein const haben?</p>
<blockquote>
<p>Ich vermute das führte dich zu deiner Aussage 'Nie', oder?</p>
</blockquote>
<p>Ja, ich rede nur vom const beim Fangen von Exceptions.</p>
<blockquote>
<p>Als Beispiel, dass du keine Kopie kriegst:</p>
</blockquote>
<p>Das ist klar.</p>
<blockquote>
<p>EDIT2: Ich hab keine Ahnung, ob es beim Weiterschmeißen eine Garantie gibt,<br />
dass das Objekt nicht kopiert wird</p>
</blockquote>
<p>Genau dafür wurde &quot;throw;&quot; erfunden. Es wird garantiert dasselbe Objekt weitergeworfen.</p>
<p>Edit: Zweideutiges &quot;Wem sagst du das denn?&quot; rausgenommen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925189</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 18:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 18:27:16 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>So oder so habe ich also in einem Catch-Block ein Objekt, das nur in Catch-Blöcken leben kann, es hat weder vor dem ersten Wurf gelebt, noch nach dem letzten Fangen. Nun ist es bei Catch-Blöcken so, dass ich nicht weitere Catch-Blöcke aufrufe wie man das bei normalen Funktionen macht, sondern ein &quot;Aufruf&quot; eines anderen Catch-Blocks bedeutet automatisch, dass der aufrufende Catchblock verlassen wird. Also bekommt der Aufrufer das Objekt nie mehr zu sehen, weshalb er sich nicht mehr für Veränderungen am Objekt interessieren kann. Welchen Sinn sollte dann also ein const haben?</p>
</blockquote>
<p>Kuck nochmal auf mein Beispiel.<br />
Im Fall dass ich die Exception weiterwerfe, interessiert mich die Änderung<br />
im nächsten catch-Block...</p>
<p>Außerdem kannst du ja (theoretisch - praktisch eher selten) einen Verweis<br />
auf irgendein länger lebendes Heap-Objekt in deiner Exception haben.<br />
Ohne const, könnstest du auf dieses Objekt ja auch schreibenden Zugriff erlangen.<br />
Die Änderung dieses Objektes wird dich in deinem späteren Programmverlauf sicher<br />
interessieren...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925213</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 18:27:16 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 18:40:01 GMT]]></title><description><![CDATA[<p>CSpille schrieb:</p>
<blockquote>
<p>Kuck nochmal auf mein Beispiel.<br />
Im Fall dass ich die Exception weiterwerfe, interessiert mich die Änderung<br />
im nächsten catch-Block...</p>
</blockquote>
<p>Ja, aber im vorherigen catch-Block nicht mehr. Wo genau hilft mir jetzt ein const?</p>
<blockquote>
<p>Außerdem kannst du ja (theoretisch - praktisch eher selten) einen Verweis<br />
auf irgendein länger lebendes Heap-Objekt in deiner Exception haben.<br />
Ohne const, könnstest du auf dieses Objekt ja auch schreibenden Zugriff erlangen.<br />
Die Änderung dieses Objektes wird dich in deinem späteren Programmverlauf sicher<br />
interessieren...</p>
</blockquote>
<p>Nein, das kann man ja gerade nicht, denn beim ersten Werfen wird <strong>immer</strong> eine Kopie angelegt:</p>
<pre><code class="language-cpp">void foo()
{
    static int bar = 42;
    throw bar;    // Kopie!
}
</code></pre>
<p>Wenn ich in diesem Fall per Referenz fange, wird einmal kopiert, wenn ich per Wert fange, wird (theoretisch) zweimal gefangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925219</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 18:40:01 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 19:09:14 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Nein, das kann man ja gerade nicht, denn beim ersten Werfen wird <strong>immer</strong> eine Kopie angelegt</p>
</blockquote>
<p>Du hast mich scheinbar nicht richtig verstanden...</p>
<p>Hier ein Beispiel, was ich meine:</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;
#include&lt;vector&gt;
#include&lt;string&gt;

class MyObject{
public:
        MyObject(const std::string&amp; name) : name(name){
        }

        void setName(const std::string&amp; name){
                this-&gt;name = name;
        }

        const std::string&amp; getName() const{
                return this-&gt;name;
        }

private:
        std::string name;
};

class DuplicateNameException{
public:
        DuplicateNameException(MyObject&amp; object) : object(object){
        }

        MyObject&amp; getObject(){
                return object;
        }

        const MyObject&amp; getObject() const{
                return object;
        }

private:
        MyObject&amp; object;
};

void createObject(std::vector&lt;MyObject*&gt;&amp; objectPool, const std::string&amp; name){
        for(std::vector&lt;MyObject*&gt;::const_iterator it = objectPool.begin(); it!=objectPool.end(); ++it){
                if(name == (*it)-&gt;getName()){
                        throw DuplicateNameException(**it);
                }
        }
        objectPool.push_back(new MyObject(name));
}

int main() {
        std::vector&lt;MyObject*&gt; objectPool;
        try{
                createObject(objectPool, &quot;test1&quot;);
                createObject(objectPool, &quot;test2&quot;);
                createObject(objectPool, &quot;test3&quot;);
                createObject(objectPool, &quot;test2&quot;);
        }
        catch(DuplicateNameException&amp; e){
                // what shall I do? Probably rename original object?
                e.getObject().setName(&quot;new name&quot;);
        }
//      catch(const DuplicateNameException&amp; e){
//              // what shall I do? Probably rename original object?
//              e.getObject().setName(&quot;new name&quot;); // Ooh... I can't rename it...
//      }
        // Let's have a look at the objects (before deleting)
        for(std::vector&lt;MyObject*&gt;::const_iterator it = objectPool.begin(); it!=objectPool.end(); ++it){
                std::cout &lt;&lt; (*it)-&gt;getName() &lt;&lt; std::endl;
                delete *it;
        }
        return 0;
}
</code></pre>
<p>Verstehst du jetzt was ich meine?</p>
<p>Von dem Pointer wird natürlich eine Kopie angelegt, aber das Objekt<br />
darin hat einen anderen Besitzer, folglich wird es nicht kopiert.</p>
<p>Ich weiß, die Objektzugehörogkeit ist RAII technisch nicht 100% sauber,<br />
aber ich hätte das gleiche mit einer Pool-Klasse machen können.<br />
Das Prinzip bleibt das gleiche, nur halt komplexer...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925239</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925239</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Mon, 12 Jul 2010 19:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 19:18:26 GMT]]></title><description><![CDATA[<p>Da hast du recht: Wenn man innerhalb des geworfenen Objekts irgendwelche Zeiger oder Referenzen hat, dann werden natürlich nur die Verweise kopiert. Meine Exception-Klassen waren nie so komplex, dass mir das aufgefallen wäre (und ich hab mir deshalb nicht so tiefgehend Gedanken gemacht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /> ). Wieder was gelernt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925245</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925245</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Mon, 12 Jul 2010 19:18:26 GMT</pubDate></item><item><title><![CDATA[Reply to Exception on Mon, 12 Jul 2010 20:28:14 GMT]]></title><description><![CDATA[<p>Also ich fange immer per const&amp;, da ich keinen Sinn darin sehe, eine gefangene Exception zu ändern. Egal ob ich sie danach weiterwerfen möchte oder nicht.</p>
<p>Wenn es an bestimmten Stellen Sinn machen sollte, dann würde ich genau dort das const weglassen und sonst nirgends.</p>
<p>Genau so mache ich es auch bei Funktionen: nur dort das const weglassen, wo es auch wirklich weggelassen werden sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1925284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1925284</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 12 Jul 2010 20:28:14 GMT</pubDate></item></channel></rss>