<?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[Rückgabe: Fehlerbeschreibung]]></title><description><![CDATA[<p>Mahlzeit,</p>
<p>ich habe eine Methode, die eine Datei einliest und dabei können verschiedene Fehler auftreten. Ich muss dem Aufrufer also mitteilen ob was schief lief und was. Lösen wollte ich das so:</p>
<pre><code class="language-cpp">bool Foo::methode(const std::string&amp; file, float x, float y, std::string&amp; error);
</code></pre>
<p>Die Methode gibt false zurück wenn was schief lief und füllt dann error. Wäre das ok so? Das einzige was mich daran etwas stört ist, dass der Benutzer IMMER einen string übergeben muss. Der Aufruf sieht ja zwangsläufig immer so aus:</p>
<pre><code class="language-cpp">string err;
bool b = foo-&gt;methode(&quot;test.dat&quot;, 2, 3, err);
if(!b) {
   mache was mit err
}
</code></pre>
<p>Wie könnte ich das elegant machen, dass der Benutzer nur optional einen string übergeben muss? (er zb keinen übergibt, wenn ihn der genaue Fehlertext nicht interessiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245531/rückgabe-fehlerbeschreibung</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 14:42:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245531.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Jul 2009 10:07:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:07:46 GMT]]></title><description><![CDATA[<p>Mahlzeit,</p>
<p>ich habe eine Methode, die eine Datei einliest und dabei können verschiedene Fehler auftreten. Ich muss dem Aufrufer also mitteilen ob was schief lief und was. Lösen wollte ich das so:</p>
<pre><code class="language-cpp">bool Foo::methode(const std::string&amp; file, float x, float y, std::string&amp; error);
</code></pre>
<p>Die Methode gibt false zurück wenn was schief lief und füllt dann error. Wäre das ok so? Das einzige was mich daran etwas stört ist, dass der Benutzer IMMER einen string übergeben muss. Der Aufruf sieht ja zwangsläufig immer so aus:</p>
<pre><code class="language-cpp">string err;
bool b = foo-&gt;methode(&quot;test.dat&quot;, 2, 3, err);
if(!b) {
   mache was mit err
}
</code></pre>
<p>Wie könnte ich das elegant machen, dass der Benutzer nur optional einen string übergeben muss? (er zb keinen übergibt, wenn ihn der genaue Fehlertext nicht interessiert)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743346</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743346</guid><dc:creator><![CDATA[knochentrocken]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:11:47 GMT]]></title><description><![CDATA[<p>Was spricht denn gegen Exceptions?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743348</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:11:47 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:19:34 GMT]]></title><description><![CDATA[<p>Naja, zum einen finde ich Exceptions hässlich. Diese ganzen try { } catch Blöcke blähen den Code auf. Dann muss ich überall kommentieren welche Funktion welche Exceptions werfen kann usw.</p>
<p>Außerdem dachte ich eine Exception ist für etwas, was eigentlich nicht auftreten dürfte. Quasi ein schwerer Fehler.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743352</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743352</guid><dc:creator><![CDATA[knochentrocken]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:19:34 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:23:05 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">bool Foo::methode(const std::string&amp; file, float x, float y, std::string* error=0)
{
    // Code...
    if( error ) {
        *error = &quot;Dieser oder jener Fehler ist geschehen...&quot;;
    }
}
}
</code></pre>
<pre><code class="language-cpp">Foo f;
std::string s;
f.methode( &quot;Nanana.txt&quot;, 12.0, 24.3, &amp;s );
std::cout &lt;&lt; s &lt;&lt; endl;
// error interessiert nicht
f.methode( &quot;Nanana2.txt&quot;, 13.9, 11.18 );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1743356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743356</guid><dc:creator><![CDATA[dödelmeier]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:23:05 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:30:39 GMT]]></title><description><![CDATA[<p>knochentrocken schrieb:</p>
<blockquote>
<p>Naja, zum einen finde ich Exceptions hässlich. Diese ganzen try { } catch Blöcke blähen den Code auf. Dann muss ich überall kommentieren welche Funktion welche Exceptions werfen kann usw.</p>
</blockquote>
<p>?!? Diese ganzen</p>
<pre><code class="language-cpp">if( !f.methode() )
{ cout &lt;&lt; &quot;Fehler passiert: &quot; &lt;&lt; f.lastError() &lt;&lt; endl; }
</code></pre>
<p>Sind doch viel hässlicher. DIE blähen den Code auf und machen ihn auch noch unübersichtlich!<br />
Es ist viel schöner, wenn du zusammenhängende Logik ohne unnötige if/else in einem Block stehen hast und nachher in übersichtlicher Weise die Fehler abfängst, oder eben absichtlich durchpurzeln lässt, wenn er nicht umschiffbar ist, damit sich das Programm beendet.</p>
<p>Außerdem werden Exceptions nicht irgendwo dokumentiert, die kommen mit in die Methoden Deklaration + Definition:</p>
<pre><code class="language-cpp">void Foo::methode() throw( MyException );
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1743365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743365</guid><dc:creator><![CDATA[dödelmeier]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:30:39 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:32:28 GMT]]></title><description><![CDATA[<p>knochentrocken schrieb:</p>
<blockquote>
<p>Außerdem dachte ich eine Exception ist für etwas, was eigentlich nicht auftreten dürfte. Quasi ein schwerer Fehler.</p>
</blockquote>
<p>Fehler, die nicht auftreten dürfen (Indexüberschreitung bei vector-Zugriff z.B.), fängt man normalerweise mit <code>assert</code> ab. Exceptions nimmt man bei Sachen, die durchaus passieren <em>können</em>, es im Regelfall aber nicht <em>sollten</em>. Es kann z.B. durchaus passieren, dass man keinen Speicher mehr allokieren kann oder dass eine Datei, die eigentlich vorhanden sein sollte, fehlt. Bei solchen &quot;Ausnahme&quot;-Fällen nimmt man idR Exceptions, <code>new</code> kann z.B. eine OutOfMemory-Exception werfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743369</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:32:28 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:44:49 GMT]]></title><description><![CDATA[<p>@dödelmeier: ich sehe da einen riesigen Unterschied. Wenn ich bei jedem Fehler eine Exception werfe, dann MUSS ich um JEDE Funktion, die potentielle eine Exception werfen kann (und das sind bei mir dann vieeeeele) ein try catch bauen.<br />
Wenn ich das nicht mache, zerlegt es mir bei einem Fehler das Programm. Ich finde sowas einfach potthässlich:</p>
<pre><code class="language-cpp">try {
   foo.method();
} 
catch(Exception&amp; e) {
  ...
}
...
try { foo2.method2();

} 
catch(Exception&amp; e) {
 ...
}
</code></pre>
<p>Das finde ich viel übersichtlicher:</p>
<pre><code class="language-cpp">if(  foo.method() ) {
  ...
}
...
foo2.method2(); // potentielle Fehler in method2() interessieren mich gerade nicht
</code></pre>
<p>Wenn ich weiß das ein potentieller Fehler in einer Methode nicht so schlimm ist, kann ich auch einfach mal die if Abfrage lassen.</p>
<p>Ich denke ich werd es mit einem string* Zeiger machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743389</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743389</guid><dc:creator><![CDATA[dödelmeier]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:51:19 GMT]]></title><description><![CDATA[<blockquote>
<p>Wie könnte ich das elegant machen, dass der Benutzer nur optional einen string übergeben muss? (er zb keinen übergibt, wenn ihn der genaue Fehlertext nicht interessiert)</p>
</blockquote>
<p>Du koenntest die Funktion ueberladen. Blaeht aber das Interface auf. Alternativ kann die Fehlermeldung auch global abgelegt werden. In C gab es das System, dass man mit perror den letzten Fehlertext ausgeben konnte. So braucht man ueberhaupt keinen zusaetzlichen Parameter und hat auch Fehlerbehandlung von Schnittstelle getrennt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743395</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:51:19 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Wed, 15 Jul 2009 10:53:35 GMT]]></title><description><![CDATA[<p>Ähm, nö nicht um jede Funktion</p>
<pre><code class="language-cpp">try {
    f.methode(); // wirft Exception1
    f.methode2(); // wirft Exception1
    someOtherDangerousThing(); // wirft Exception2
    std::vector&lt;int&gt; intVec;
    intVec.at(333); // wirft std::out_of_range
} catch( const Exception1&amp; e ) {
    // Behandlen
} catch( const Exception2&amp; e ) {
    // Behandeln
} catch( const std::out_of_range&amp; e ( {
    // Behandeln
}
</code></pre>
<p>Find ich angenehmer, da der Codefluss klar ist. Lass das mal komplexer sein als nur so paar Methodenaufrufe.</p>
<p>Aber im Prinzip ist es Geschmackssache. Und wenn du ganz lieb zum User bist, gib dem Konstruktor deiner Objekte ein Flag mit, ob Methoden Exceptions werfen sollen oder über Rückgabewerte laufen <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/1743397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743397</guid><dc:creator><![CDATA[Original Dödelmeier _P]]></dc:creator><pubDate>Wed, 15 Jul 2009 10:53:35 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Thu, 16 Jul 2009 09:24:15 GMT]]></title><description><![CDATA[<p>Original Dödelmeier _P schrieb:</p>
<blockquote>
<p>Ähm, nö nicht um jede Funktion</p>
<pre><code class="language-cpp">try {
    f.methode(); // wirft Exception1
    f.methode2(); // wirft Exception1
    someOtherDangerousThing(); // wirft Exception2
    std::vector&lt;int&gt; intVec;
    intVec.at(333); // wirft std::out_of_range
} catch( const Exception1&amp; e ) {
    // Behandlen
} catch( const Exception2&amp; e ) {
    // Behandeln
} catch( const std::out_of_range&amp; e ( {
    // Behandeln
}
</code></pre>
<p>Find ich angenehmer, da der Codefluss klar ist. Lass das mal komplexer sein als nur so paar Methodenaufrufe.</p>
<p>Aber im Prinzip ist es Geschmackssache. Und wenn du ganz lieb zum User bist, gib dem Konstruktor deiner Objekte ein Flag mit, ob Methoden Exceptions werfen sollen oder über Rückgabewerte laufen <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>
</blockquote>
<p>Ich finde, die Verwendung von Exceptions ist nicht Geschmacksache, sondern professionelles C++. Nicht umsonst kennen alle (oder die meisten?) modernen Sprachen Exceptions. Sieh dir doch nur das Problem an, mit dem dieser Thread eröffnet wurde! Das ist nur die Spitze des Eisbergs, wenn man mit Rückgabe-Codes arbeitet.</p>
<p>Die Argumente für die Verwendung von Exceptions sind Legion und es gibt nur wenige ernstzunehmende Ausnahmen.</p>
<p>Stefan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1743988</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1743988</guid><dc:creator><![CDATA[DStefan]]></dc:creator><pubDate>Thu, 16 Jul 2009 09:24:15 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabe: Fehlerbeschreibung on Fri, 17 Jul 2009 07:59:15 GMT]]></title><description><![CDATA[<p>knochentrocken schrieb:</p>
<blockquote>
<p>Naja, zum einen finde ich Exceptions hässlich. Diese ganzen try { } catch Blöcke blähen den Code auf. Dann muss ich überall kommentieren welche Funktion welche Exceptions werfen kann usw.</p>
</blockquote>
<p>Den Code muss es nicht aufblähen. Im Gegenteil es hilft den ganzen Code von Errorhandling zu befreien und macht das ganze klarer und auch kompakter.</p>
<p>Du kannst einen Error Handler z.b in der main um alles machen und dann dort bestimmen, was passieren soll. (Meist ist das wohl eine Meldung in Form von Textausgabe).<br />
Wenn du dann etwas hast, wogegen du etwas tun kannst, dann bringst du einen Handler auf einer tieferen Stufe an. Um am Beispiel von Badestrand festzuhalten, könntest du, wenn du ein File nicht findest das abfangen und halt auf ein Dummy File zugreifen. (Falls das auch nicht klappt wird die Exception halt wieder gewofen).</p>
<blockquote>
<p>Außerdem werden Exceptions nicht irgendwo dokumentiert, die kommen mit in die Methoden Deklaration + Definition:</p>
</blockquote>
<p>Das wäre der Idealfall, wenn es so funktionieren würde, wie die meisten vermuten.. Allerdings verhalten sich Exception Spezifikationen nicht so, wie die meisten meinen:<br />
<a href="http://www.gotw.ca/publications/mill22.htm" rel="nofollow">http://www.gotw.ca/publications/mill22.htm</a></p>
<p>Daher ist es meist mit einem kurzen Kommentar eigentlich getan.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1744629</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1744629</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 17 Jul 2009 07:59:15 GMT</pubDate></item></channel></rss>