<?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[Fehlerhandling Goto Label?]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>in einer Funktion werden andere Funktionen aufgerufen. Diese geben einen int zurück. Wenn der int negativ ist muss ich bestimmte Aufräumfunktionen aufrufen und bestimmte Dinge freigeben. Wie macht man das?</p>
<p>1. Nach jeder Funktion den RetVal überprüfen und bei Fehler aufräumen? -&gt; Es sammeln sich die Aufräumaufrufe bei den hinteren Funktionen. Auerdem doppelter Code.</p>
<pre><code class="language-cpp">if (myFunc1(1)&lt;1)
delete a;

if (myFunc2(1)&lt;1) {
delete a;
delete b;
}
...
</code></pre>
<p>2. Den Code in eine TryCatch Klausel einfangen und bei negativen Rückgabewert einen Fehler werfen. -&gt; Die Objekte müssen Funktionsglobal deklariert werden, damit sie auch im Catch Block freigegeben werden können.</p>
<pre><code class="language-cpp">myclass *bob;

try {
if (myfunc(bob)&lt;1)
throw -1;
} catch {
delete bob;
}
</code></pre>
<p>3. Anstatt des throw ein goto zum Funktionsende. -&gt; Goto keine Deklarationen oder Initialisatoren überspringen.</p>
<pre><code class="language-cpp">if (myfunc(1)&lt;1)
goto CleanUp;
// Hier darf nichts deklariert oder initialisiert werden.
CleanUp:
delete bob;
</code></pre>
<p>Alle drei Möglichkeiten sind bescheiden. Gibt es bessere Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/177749/fehlerhandling-goto-label</link><generator>RSS for Node</generator><lastBuildDate>Wed, 24 Jun 2026 13:01:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/177749.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 03 Apr 2007 18:04:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Tue, 03 Apr 2007 18:04:26 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>in einer Funktion werden andere Funktionen aufgerufen. Diese geben einen int zurück. Wenn der int negativ ist muss ich bestimmte Aufräumfunktionen aufrufen und bestimmte Dinge freigeben. Wie macht man das?</p>
<p>1. Nach jeder Funktion den RetVal überprüfen und bei Fehler aufräumen? -&gt; Es sammeln sich die Aufräumaufrufe bei den hinteren Funktionen. Auerdem doppelter Code.</p>
<pre><code class="language-cpp">if (myFunc1(1)&lt;1)
delete a;

if (myFunc2(1)&lt;1) {
delete a;
delete b;
}
...
</code></pre>
<p>2. Den Code in eine TryCatch Klausel einfangen und bei negativen Rückgabewert einen Fehler werfen. -&gt; Die Objekte müssen Funktionsglobal deklariert werden, damit sie auch im Catch Block freigegeben werden können.</p>
<pre><code class="language-cpp">myclass *bob;

try {
if (myfunc(bob)&lt;1)
throw -1;
} catch {
delete bob;
}
</code></pre>
<p>3. Anstatt des throw ein goto zum Funktionsende. -&gt; Goto keine Deklarationen oder Initialisatoren überspringen.</p>
<pre><code class="language-cpp">if (myfunc(1)&lt;1)
goto CleanUp;
// Hier darf nichts deklariert oder initialisiert werden.
CleanUp:
delete bob;
</code></pre>
<p>Alle drei Möglichkeiten sind bescheiden. Gibt es bessere Möglichkeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1258763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1258763</guid><dc:creator><![CDATA[Mokka]]></dc:creator><pubDate>Tue, 03 Apr 2007 18:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Tue, 03 Apr 2007 18:33:19 GMT]]></title><description><![CDATA[<p>Wie wär's mit std::auto_ptr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1258786</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1258786</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Tue, 03 Apr 2007 18:33:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 01:55:56 GMT]]></title><description><![CDATA[<p>Sobald irgendwo Exceptions fliegen können verwendet man sowieso am besten Guards (eben sowas wie std::auto_ptr), so dass garkein explizites &quot;Wegputzen&quot; mehr notwendig ist. In dem Fall kann man dann einfach &quot;if (int error = blubb()) return error;&quot; schreiben.</p>
<p>Und natürlich gibt es noch eine andere Möglichkeit: &quot;nested if&quot; Orgien zu bauen. Vorteil gegenüber deiner Version 1 ist dass man keine Aufräumarbeiten wiederholen muss, und von oben nach unten gelesen &quot;Arbeit&quot; nicht mit &quot;aufräumen&quot; vermischt. Allerdings ist es potthässlich sobald mal mehr als 2 oder 3 Ebenen zusammenbekommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1258904</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1258904</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 04 Apr 2007 01:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 11:46:49 GMT]]></title><description><![CDATA[<p>Ich arbeite gerade an dem WMI Beispiel von -King- da muß ich am Ende CoUninitialize() aufrufen:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-92750.html#92750" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-p-is-92750.html#92750</a></p>
<p>Die AutoPointer sind in diesen Fall keine optimale Lösung. Die geschachtelten If Anweisungen sind unübersichtlich. Wenn ich longjmp benutze werde ich gehängt *g*<br />
<a href="http://en.wikipedia.org/wiki/Longjmp" rel="nofollow">http://en.wikipedia.org/wiki/Longjmp</a></p>
<p>Hmhm. In diesen Fall werde ich die Vorlage von King übernehmen. Aber richtig optimal ist keine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259185</guid><dc:creator><![CDATA[Mokka]]></dc:creator><pubDate>Wed, 04 Apr 2007 11:46:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 11:51:02 GMT]]></title><description><![CDATA[<p>Mokka schrieb:</p>
<blockquote>
<p>Ich arbeite gerade an dem WMI Beispiel von -King- da muß ich am Ende CoUninitialize() aufrufen:</p>
</blockquote>
<p>So was lässt sich prima in einer Klasse kapseln, die das dann eben in ihrem Destruktor tut. Das gleiche kann für die Interfacezeiger und den BSTR tun. Dafür gibt es sogar schon fertige Klassen.</p>
<blockquote>
<p>Die AutoPointer sind in diesen Fall keine optimale Lösung.</p>
</blockquote>
<p>Wieso nicht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259192</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 04 Apr 2007 11:51:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 12:00:22 GMT]]></title><description><![CDATA[<p>Den Autopointer könnte ich verwenden um die std::string Objekte zu löschen, aber nicht um CoUninitialize() aufzurufen. Es sei denn ich packe alles in eine Klassen. Dann muß ich aber wieder Klassenvariablen definieren um im Destruktor die Aufräumarbeit zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259200</guid><dc:creator><![CDATA[Mokka]]></dc:creator><pubDate>Wed, 04 Apr 2007 12:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 12:08:02 GMT]]></title><description><![CDATA[<p>Mokka schrieb:</p>
<blockquote>
<p>Dann muß ich aber wieder Klassenvariablen definieren um im Destruktor die Aufräumarbeit zu machen.</p>
</blockquote>
<p>Und was ist so schlimm daran? Die Klasse mußt du einmal schreiben und kannst sie dann immer wieder verwenden. Und in der Anwendung reicht es aus, ein Objekt am Funktionsanfang anzulegen (und dann darauf zu warten, daß es aus dem Scope fällt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259211</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259211</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 04 Apr 2007 12:08:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 12:33:07 GMT]]></title><description><![CDATA[<p>Ich möchte nicht für jeden Schnipsel eine extra Klasse machen. Wenn ich mehr mit WMI machen möchte ist es aber überlegenswert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259246</guid><dc:creator><![CDATA[Mokka]]></dc:creator><pubDate>Wed, 04 Apr 2007 12:33:07 GMT</pubDate></item><item><title><![CDATA[Reply to Fehlerhandling Goto Label? on Wed, 04 Apr 2007 12:41:47 GMT]]></title><description><![CDATA[<p>Mokka schrieb:</p>
<blockquote>
<p>Ich möchte nicht für jeden Schnipsel eine extra Klasse machen.</p>
</blockquote>
<p>Du kannst dir aussuchen, ob du für jede einzelne Ressource Aufräumarbeit verrichtest (und das u.U. mehrfach, je nach Verschachtelung), oder ob du für jede Art, Ressourcen freizugeben, einmal eine Klasse schreibst, und damit auch gleich noch Exceptionsicherheit obendrauf bekommst.</p>
<p>Und wie gesagt, CComPtr und CComBSTR gibt's schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1259250</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1259250</guid><dc:creator><![CDATA[MFK]]></dc:creator><pubDate>Wed, 04 Apr 2007 12:41:47 GMT</pubDate></item></channel></rss>