<?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[Fehler in Typenkonstruktor ohne throw bemerkbar machen?]]></title><description><![CDATA[<p>Hallo</p>
<p>Wie der Titel schon sagt, will ich in einem Konstruktor einer Klasse einen Fehler bemerkbar machen. Ich kann kein throw verwenden und Rückgabewerte gibts nicht. Was soll ich tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/279425/fehler-in-typenkonstruktor-ohne-throw-bemerkbar-machen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 24 Aug 2026 15:17:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/279425.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Dec 2010 18:24:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 18:24:02 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Wie der Titel schon sagt, will ich in einem Konstruktor einer Klasse einen Fehler bemerkbar machen. Ich kann kein throw verwenden und Rückgabewerte gibts nicht. Was soll ich tun?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999066</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999066</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 26 Dec 2010 18:24:02 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 18:38:01 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich kann kein throw verwenden</p>
</blockquote>
<p>Warum kannst Du keine Exception werfen? Nimmt mich einfach wunder.</p>
<p>Als Lösung könntest Du eine Init Methode bereitstellen, welche einen Return Wert hat. Die Init Methode übernimmt dann die eigentliche Initialisierung. Das ganze kannst Du in eine Factory Methode packen, sodas kein der Aufruf von Init garantiert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999072</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 26 Dec 2010 18:38:01 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 18:50:14 GMT]]></title><description><![CDATA[<p>theta schrieb:</p>
<blockquote>
<p>Warum kannst Du keine Exception werfen?</p>
</blockquote>
<p>Vorschrift... (Exception-Handeling ist untersagt)</p>
<p>theta schrieb:</p>
<blockquote>
<p>...Factory Methode packen, sodas ein der Aufruf von Init garantiert ist.</p>
</blockquote>
<p>Ich mag Init-Funktionen nicht sonderlich, aber egal. Wie geht das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999077</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999077</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 26 Dec 2010 18:50:14 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:08:42 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Ich mag Init-Funktionen nicht sonderlich, aber egal. Wie geht das?</p>
</blockquote>
<p>In dem man einen Konstruktor nimmt, der das Objekt stabil konstruiert, aber alle wichtigen Dinge noch nicht setzt und anschließend initialisiert man mittels init Methode mit Rückgabewert das Objekt.</p>
<pre><code class="language-cpp">class Foo {
    Foo () {}
    ~Foo() {}
    int init (Argumentliste) {
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1999082</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999082</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:08:42 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:14:40 GMT]]></title><description><![CDATA[<p>~john schrieb:</p>
<blockquote>
<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Ich mag Init-Funktionen nicht sonderlich, aber egal. Wie geht das?</p>
</blockquote>
<p>In dem man einen Konstruktor nimmt, der das Objekt stabil konstruiert, aber alle wichtigen Dinge noch nicht setzt und anschließend initialisiert man mittels init Methode mit Rückgabewert das Objekt.</p>
<pre><code class="language-cpp">class Foo {
    Foo () {}
    ~Foo() {}
    int init (Argumentliste) {
    }
};
</code></pre>
</blockquote>
<pre><code class="language-cpp">Foo a();
a.init();
</code></pre>
<p>Gute Idee, danke!</p>
<p>Aber was, wenn ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> kommt und</p>
<pre><code class="language-cpp">Foo a();
//a nutzen
</code></pre>
<p>schreibt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999083</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:14:40 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:18:37 GMT]]></title><description><![CDATA[<p>Deshalb ist es Schwachfug Exceptionhandling zu verbieten. In Java verbietet man ja auch nicht finally...</p>
<p>Das Objekt muss bei JEDEM methoden aufruf checken ob es in einem ordentlichen State ist. Siehe zB die stream Klassen. Da wird dann das bad-Flag gesetzt und du musst immer per obj.good() schauen ob es in einem guten Status ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999085</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:18:37 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:22:19 GMT]]></title><description><![CDATA[<p>Und was ist mit einem globalen Error-System wie es die WinAPI hat?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999089</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:25:48 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Aber was, wenn ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> kommt und</p>
<pre><code class="language-cpp">Foo a();
//a nutzen
</code></pre>
<p>schreibt?</p>
</blockquote>
<p>&quot;shit happens&quot; Wenn man auf Exceptions verzichtet muß man sich von bestimmten Garantien verabschieden. Beides kann man nicht haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999090</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999090</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:25:48 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 19:25:23 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Und was ist mit einem globalen Error-System wie es die WinAPI hat?</p>
</blockquote>
<p>Das hilft auch nicht weiter, da man explizit nach jedem Konstrukturaufruf das überprüfen müßte. Tut man dies nicht -&gt; Schrott.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999091</guid><dc:creator><![CDATA[*john 0]]></dc:creator><pubDate>Sun, 26 Dec 2010 19:25:23 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Sun, 26 Dec 2010 20:16:55 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Aber was, wenn ein <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> kommt und</p>
<pre><code class="language-cpp">Foo a();
//a nutzen
</code></pre>
<p>schreibt?</p>
</blockquote>
<p>Deshalb mein Vorschlag mit der Factory Methode.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999108</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Sun, 26 Dec 2010 20:16:55 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Mon, 27 Dec 2010 01:24:49 GMT]]></title><description><![CDATA[<p>Auf die ursprüngliche Frage bezogen...</p>
<p>Ich kenne zwei Möglichkeiten die halbwegs gut funktionieren.</p>
<ol>
<li>Man verpasst jeder Klasse eine &quot;GetLastError&quot; Funktion. Ala so:</li>
</ol>
<pre><code class="language-cpp">void foo()
{
    bar b(1, 2, 3);
    if (b.GetLastError())
        FehlerBehandeln();
}
</code></pre>
<ol start="2">
<li>Man gibt jedem ctor eine Referenz auf einen Error-Wert mit. Sieht dann so aus:</li>
</ol>
<pre><code class="language-cpp">void foo()
{
    ErrorCode ec = Success;
    bar b(1, 2, 3, ec);
    if (ec != Success)
        FehlerBehandeln();
}
</code></pre>
<p>Dabei ist es nicht unüblich, wenn der ctor als erstes den Error-Code prüft, und falls dieser nicht &quot;Success&quot; ist, einfach nichts macht (nichtmal Parameter/Preconditions überprüft) - und den alten Error-Code auch in der Variable stehen lässt.<br />
Dadurch kann man das ganz schön verketten, und muss an weniger Stellen den Fehlercode prüfen.</p>
<pre><code class="language-cpp">void foo()
{
    ErrorCode ec = Success;

    bar b(1, 2, 3, ec);
    baz bz(b, ec); // tut nix wenn der ctor von bar ein problem hatte
    qux q(b, bz, ec); // tut nix wenn der ctor von bar oder baz ein problem hatte

    if (ec != Success)
        FehlerBehandeln();
}
</code></pre>
<p>----</p>
<p>Empfehlen würde ich es auch nicht, aber wenn es eine Vorgabe ist...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999170</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 27 Dec 2010 01:24:49 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Mon, 27 Dec 2010 05:55:27 GMT]]></title><description><![CDATA[<p>Also ehrlich, ihr stellt euch mal wieder an. Die file streams zeigen doch, wie es ohne Exceptions geht, weil C++ Exceptions einfach nichts taugen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999185</guid><dc:creator><![CDATA[1stPro]]></dc:creator><pubDate>Mon, 27 Dec 2010 05:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to Fehler in Typenkonstruktor ohne throw bemerkbar machen? on Mon, 27 Dec 2010 15:17:43 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19131">@theta</a>: Die Factory Methode (ob als Klassen-Methode oder freie Funktion) allein kann zwar garantieren, dass Ctor + init aufgerufen wird, aber nur nullptr oder Foo* zurückgeben. Was für ein Fehler aufgetreten ist, weiss man aber im nullptr-Fall dadurch nicht.</p>
<p>Hier müsste man dann wieder auf hustbaer's Vorschläge zurückgreifen (getLastError, global, Referenzen), da kann man sich die Factory Methode auch sparen (wenn es nur darum geht, nicht noch um die eigentliche Funktion einer Factory Method).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1999319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1999319</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 27 Dec 2010 15:17:43 GMT</pubDate></item></channel></rss>