<?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-safe problem]]></title><description><![CDATA[<p>Gibts für das was ich vor habe irgendein Pattern? Eine Richtlinie? Erstmal zum Vorhaben:</p>
<p>Ich schreibe mir gerade einen Mini-ODBC-Wrapper um meine Schulübungen einfacher erledigen zu können. Folgender Mini-Auszug:</p>
<pre><code class="language-cpp">class Connection
{
public:
    Query* query (TCHAR* sql) { return new Query(hdbc,sql); }
};

class Query
{
public:
    Query (HDBC hdbc, TCHAR* sql)
    {
        allocate things
    }
    ~Query ()
    {
        free things
    }
};
</code></pre>
<p>Warum die Sache mit dem new werdet ihr euch fragen. Nun, ich will, dass die Methode Connection::query() ein Query-Objekt zurückgibt. Per Value funktioniert nicht weil sonst Query im Destruktor das HSTMT-Handle schließt (lokale Objekte sterben ja bekanntermaßen).</p>
<p>Also mache ich new und lasse den User per Release() das objekt zu späterem Zeitpunkt wieder freigeben. Bzw. erstmal mit delete.</p>
<p>Noch kein Problem in Sicht. Doch will ich Fehlerbehandlung nun mit Exceptions einbauen:</p>
<pre><code class="language-cpp">try
{
    Connection* conn = manager-&gt;connect(dsn,uid,pwd);
    // arbeite mit conn
    delete conn; // oder eben release, etc.
}
catch(Exception&amp; e)
{
    // fehler
}
</code></pre>
<p>Problem: Im Falle einer Exception wird das Objekt nicht mehr gelöscht. Was also tun?</p>
<p>Anderes Problem: Auch in Destruktoren können Fehler auftreten: Was nun tun? Einfach ignorieren?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/124028/exception-safe-problem</link><generator>RSS for Node</generator><lastBuildDate>Sun, 23 Aug 2026 20:13:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/124028.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 22 Oct 2005 18:38:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 18:38:12 GMT]]></title><description><![CDATA[<p>Gibts für das was ich vor habe irgendein Pattern? Eine Richtlinie? Erstmal zum Vorhaben:</p>
<p>Ich schreibe mir gerade einen Mini-ODBC-Wrapper um meine Schulübungen einfacher erledigen zu können. Folgender Mini-Auszug:</p>
<pre><code class="language-cpp">class Connection
{
public:
    Query* query (TCHAR* sql) { return new Query(hdbc,sql); }
};

class Query
{
public:
    Query (HDBC hdbc, TCHAR* sql)
    {
        allocate things
    }
    ~Query ()
    {
        free things
    }
};
</code></pre>
<p>Warum die Sache mit dem new werdet ihr euch fragen. Nun, ich will, dass die Methode Connection::query() ein Query-Objekt zurückgibt. Per Value funktioniert nicht weil sonst Query im Destruktor das HSTMT-Handle schließt (lokale Objekte sterben ja bekanntermaßen).</p>
<p>Also mache ich new und lasse den User per Release() das objekt zu späterem Zeitpunkt wieder freigeben. Bzw. erstmal mit delete.</p>
<p>Noch kein Problem in Sicht. Doch will ich Fehlerbehandlung nun mit Exceptions einbauen:</p>
<pre><code class="language-cpp">try
{
    Connection* conn = manager-&gt;connect(dsn,uid,pwd);
    // arbeite mit conn
    delete conn; // oder eben release, etc.
}
catch(Exception&amp; e)
{
    // fehler
}
</code></pre>
<p>Problem: Im Falle einer Exception wird das Objekt nicht mehr gelöscht. Was also tun?</p>
<p>Anderes Problem: Auch in Destruktoren können Fehler auftreten: Was nun tun? Einfach ignorieren?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898905</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sat, 22 Oct 2005 18:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 19:05:40 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Problem: Im Falle einer Exception wird das Objekt nicht mehr gelöscht. Was also tun?</p>
</blockquote>
<p>Smart-Ptr?</p>
<blockquote>
<p>Anderes Problem: Auch in Destruktoren können Fehler auftreten: Was nun tun? Einfach ignorieren?</p>
</blockquote>
<p>Weißt du nicht wie du verfahren sollst wenn ein Dtor aufgrund einer Exception aufgerufen wird und dieser Dtor ebenfalls Exceptions werfen könnte?<br />
Wenn ja: Ich würde es so machen: (Wobei ich mir nicht ganz sicher bin ob das legal ist <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> ist rein aus dem Bauch heraus...)</p>
<pre><code class="language-cpp">class foo
{
   public:
      ~foo()
       {
          try
          {
               // destruieren.
          }
          catch(dtor_error&amp; err)
          {
               if(uncaught_exception())
                    // Dtor wurde aufgrund einer Exception aufgerufen
                    // UND eine exception ist zusätzlich in selbigem aufgetreten
               else
                    // Exception ist nur im Dtor geworfen worden.
          }
       }
};
</code></pre>
<p>Gruß Caipi</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898917</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898917</guid><dc:creator><![CDATA[Caipi]]></dc:creator><pubDate>Sat, 22 Oct 2005 19:05:40 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 19:07:46 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Problem: Im Falle einer Exception wird das Objekt nicht mehr gelöscht. Was also tun?</p>
</blockquote>
<p>Bringt dich auto_ptr weiter?</p>
<pre><code class="language-cpp">try
{
    std::auto_ptr&lt;Connection&gt; conn(manager-&gt;connect(dsn,uid,pwd));
    // arbeite mit conn
}
catch(Exception&amp; e)
{
    // fehler
}
</code></pre>
<p>SideWinder schrieb:</p>
<blockquote>
<p>Anderes Problem: Auch in Destruktoren können Fehler auftreten: Was nun tun? Einfach ignorieren?</p>
</blockquote>
<p>Was heißt denn &quot;können Fehler auftreten&quot;? Zwangsläufig Exceptions? Wenn ja, musst du die propagieren oder kannst du sie im Dtor behandeln?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898918</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898918</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Sat, 22 Oct 2005 19:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 20:39:43 GMT]]></title><description><![CDATA[<p>Destruktoren sollten niemals Exceptions werfen dürfen, weil sonst niemals Exceptionsicherheit garantiert werden kann!</p>
<p>Nachzulesen in &quot;Exceptional C++&quot; von Herb Sutter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898959</guid><dc:creator><![CDATA[pZy]]></dc:creator><pubDate>Sat, 22 Oct 2005 20:39:43 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 20:43:22 GMT]]></title><description><![CDATA[<p>-&gt; Also ich verwende jetzt auto_ptr, der reicht mir.<br />
-&gt; In Destruktoren werden Fehler nun ignoriert. Sollte etwas wie SQLFreeHandle() jemals fehlschlagen ist sowieso das Programm ebreits abschussreif.</p>
<p>Danke an alle <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="🙂"
    /></p>
<p>Anmerkung: C++ fehlt das finally-Schlüsselwort aus Java.</p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/898960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898960</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sat, 22 Oct 2005 20:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sat, 22 Oct 2005 20:49:20 GMT]]></title><description><![CDATA[<p>Das ist Pflichtlektüre für solche Sachen: <a href="http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/" rel="nofollow">http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/898964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/898964</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Sat, 22 Oct 2005 20:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sun, 23 Oct 2005 09:39:46 GMT]]></title><description><![CDATA[<p>SideWinder schrieb:</p>
<blockquote>
<p>Anmerkung: C++ fehlt das finally-Schlüsselwort aus Java.</p>
</blockquote>
<p>Nö. C++ verfolgt einfach einen anderen Ansatz. Man verwendet RAII und verzichtet größten Teils auf try-catch-Blöcke (und damit auch auf finally). Ob man das jetzt elleganter findet oder nicht, sei dahin gestellt. Fakt ist, dass<br />
eins von beiden reicht um Duplikation zu verhindern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899150</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sun, 23 Oct 2005 09:39:46 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sun, 23 Oct 2005 15:30:33 GMT]]></title><description><![CDATA[<blockquote>
<p>Das ist Pflichtlektüre für solche Sachen: <a href="http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/" rel="nofollow">http://www.cuj.com/documents/s=8000/cujcexp1812alexandr/</a></p>
</blockquote>
<p>Thx, werd mir das auch mal bei Gelegenheit reinziehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899392</guid><dc:creator><![CDATA[pZy]]></dc:creator><pubDate>Sun, 23 Oct 2005 15:30:33 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Sun, 23 Oct 2005 15:43:28 GMT]]></title><description><![CDATA[<p>Hat das CUJ ein Problem mit Opera? Die Seite zeigt im Opera nichts an <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<blockquote>
<p>Ob man das jetzt elleganter findet oder nicht,...</p>
</blockquote>
<p>...hängt wohl auch damit zusammen was man in letzter Zeit benützt hat *g*</p>
<p>Danke nochmal <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="🙂"
    /></p>
<p>MfG SideWinder</p>
]]></description><link>https://www.c-plusplus.net/forum/post/899404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/899404</guid><dc:creator><![CDATA[SideWinder]]></dc:creator><pubDate>Sun, 23 Oct 2005 15:43:28 GMT</pubDate></item><item><title><![CDATA[Reply to exception-safe problem on Mon, 24 Oct 2005 12:57:04 GMT]]></title><description><![CDATA[<blockquote>
<p>Die Seite zeigt im Opera nichts an</p>
</blockquote>
<p>Bei mir genauso.<br />
Dafür hab ich meinem Opera so einen schönen &quot;Mit IE öffnen&quot; Button zugelegt <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/900032</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/900032</guid><dc:creator><![CDATA[pZy]]></dc:creator><pubDate>Mon, 24 Oct 2005 12:57:04 GMT</pubDate></item></channel></rss>