<?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[try&#x2F;catch in do&#x2F;while = endlosschleife?]]></title><description><![CDATA[<p>Hi, wir fangen bei uns an der Uni gerade mit c++ an, und sollen ein kleines Konsolen Programm schreiben, das u.A. exception-handling benutzt...</p>
<p>Für eine Menüsteuerung dachte ich mir daher, man könne einfach per try-catch Fehleingaben abfangen. Ich benutze zum einlesen den std::cin Befehl. Wird allerdings eine Exception geworfen, so wiederholt sich zwar die do-while schleife, der cin Befehl wird aber übersprungen...</p>
<p>Hier mein Programmcode:</p>
<pre><code>int auswahl;
bool eingabe_ok = false;

cout &lt;&lt; &quot;\n +++++ &quot; &lt;&lt; getName() &lt;&lt; &quot;: Wähle eine Funktion:&quot;;

// Erwartet wird die Eingabe &quot;1&quot; oder &quot;2&quot;

do{
cout &lt;&lt; &quot;\n +++++ Triff deine Auswahl: &quot;;
try{
cin &gt;&gt; auswahl;
if(auswahl == 1 || auswahl == 2) eingabe_ok = true;
else cout &lt;&lt; &quot;\n +++++ Bitte korrigieren Sie Ihre Eingabe.&quot;;
}catch(...){
cout &lt;&lt; &quot;\n +++++ Bitte korrigiere deine Eingabe.&quot;;
}
}while(eingabe_ok == false);
</code></pre>
<p>Gibt man nun was anderes als 1 oder 2 ein (bla, blubb, foo, alles was halt ein String ist), so kommt ununterbrochen die Ausgabe:</p>
<p>+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.</p>
<p>Wenn es am cin Befehl liegt, könnte mir dann jemand den korrigierten Code geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/227458/try-catch-in-do-while-endlosschleife</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 23:20:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/227458.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Nov 2008 17:10:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sat, 15 Nov 2008 17:10:16 GMT]]></title><description><![CDATA[<p>Hi, wir fangen bei uns an der Uni gerade mit c++ an, und sollen ein kleines Konsolen Programm schreiben, das u.A. exception-handling benutzt...</p>
<p>Für eine Menüsteuerung dachte ich mir daher, man könne einfach per try-catch Fehleingaben abfangen. Ich benutze zum einlesen den std::cin Befehl. Wird allerdings eine Exception geworfen, so wiederholt sich zwar die do-while schleife, der cin Befehl wird aber übersprungen...</p>
<p>Hier mein Programmcode:</p>
<pre><code>int auswahl;
bool eingabe_ok = false;

cout &lt;&lt; &quot;\n +++++ &quot; &lt;&lt; getName() &lt;&lt; &quot;: Wähle eine Funktion:&quot;;

// Erwartet wird die Eingabe &quot;1&quot; oder &quot;2&quot;

do{
cout &lt;&lt; &quot;\n +++++ Triff deine Auswahl: &quot;;
try{
cin &gt;&gt; auswahl;
if(auswahl == 1 || auswahl == 2) eingabe_ok = true;
else cout &lt;&lt; &quot;\n +++++ Bitte korrigieren Sie Ihre Eingabe.&quot;;
}catch(...){
cout &lt;&lt; &quot;\n +++++ Bitte korrigiere deine Eingabe.&quot;;
}
}while(eingabe_ok == false);
</code></pre>
<p>Gibt man nun was anderes als 1 oder 2 ein (bla, blubb, foo, alles was halt ein String ist), so kommt ununterbrochen die Ausgabe:</p>
<p>+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.<br />
+++++ Triff deine Auswahl:<br />
+++++ Bitte korrigiere deine Eingabe.</p>
<p>Wenn es am cin Befehl liegt, könnte mir dann jemand den korrigierten Code geben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615207</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615207</guid><dc:creator><![CDATA[SebSnake]]></dc:creator><pubDate>Sat, 15 Nov 2008 17:10:16 GMT</pubDate></item><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sat, 15 Nov 2008 17:24:22 GMT]]></title><description><![CDATA[<p>so benutzt du try/catch auch völlig falsch</p>
<p>so benutzt man es richtig</p>
<pre><code class="language-cpp">int foo(int a)  throw char*    //muss man aber nicht schreiben, mehr dazu unten
{
    if ( a == 0 )
       throw &quot;Fehler&quot;;
    else
       return a*a*a;
}

int main()
{
    int i;
    cin &gt;&gt; i;
    try {
      foo(i);
    catch(const char* a);
    cout &lt;&lt; a &lt;&lt; endl;
}
</code></pre>
<p>das throw (oder wars throws??) ist nicht nötig, man kennzeichnet so nur in der funktions deklaration dass eine exceptions geworfen werden kann<br />
schriebt man nichts hin kann alles passieren, schreibt man throw &quot;Datentyp&quot; dahin wird eine exception von genau diesen typ geworfen (in dem beispiel ein char* string), lässt man die klammern bei dem throw leer kann nichts geworfen werden</p>
<p>ich halte dein programm design jedoch nicht so für gut weil man exceptions eig nurw enig braucht und wennd ann nur wenn etwas vorhersehbares fehler erzeugt, was man nicht umgehen kann<br />
aber naja denk ein wenig drüber nach dann schaffst du das, das technische sollte ejtzt kein problem mehr sein</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615215</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615215</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 15 Nov 2008 17:24:22 GMT</pubDate></item><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sat, 15 Nov 2008 18:21:12 GMT]]></title><description><![CDATA[<p>Das Problem ist ein anderes. Durch das misslungene Einlesen eines Integers wird das Failbit von Cin gesetzt. Das musst Du dann erst zurücksetzen. So geht es:</p>
<pre><code class="language-cpp">int main()
{
    int auswahl;
    bool eingabe_ok = false;

    do {
        cout &lt;&lt; &quot;\n +++++ Triff deine Auswahl: &quot;;
        cin &gt;&gt; auswahl;

        if(!cin || auswahl &lt; 1 || auswahl &gt; 2)
        {
            cout &lt;&lt; &quot;\n +++++ Bitte korrigieren Sie Ihre Eingabe.&quot;;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits&lt;std::streamsize&gt;::max(), '\n');
        }else
            eingabe_ok = true;

    } while (eingabe_ok == false);

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1615244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615244</guid><dc:creator><![CDATA[Wirdbald]]></dc:creator><pubDate>Sat, 15 Nov 2008 18:21:12 GMT</pubDate></item><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sat, 15 Nov 2008 19:36:17 GMT]]></title><description><![CDATA[<p>und das problem ja...<br />
dachte es geht ihm hauptsächlich um das try catch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615279</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615279</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sat, 15 Nov 2008 19:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sat, 15 Nov 2008 20:25:30 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/18806">@Skym0sh0</a>,<br />
<code>throws</code> ? Wir sind hier nicht in Java! lol<br />
Grundsätzlich hält man es in C++ so, dass man bei der Funktion nichts angibt über die möglichen geworfenen Exceptions, da dies &quot;Fehleranfällig&quot; ist. Gerade in den Templates kann man im allgemeinen nicht wissen, was ein Template für eine Exception werfen kann, wodurch man diese Spezifikation bei der Funktion nicht angeben kann. Zudem wird sie anders angegeben, dass solltest du nochmals nachlesen.</p>
<p>Zu Exceptions haben wir übrigens drei sehr gute Artikel im Magazin:<br />
<a href="http://magazin.c-plusplus.net/artikel/Exception-Handling" rel="nofollow">http://magazin.c-plusplus.net/artikel/Exception-Handling</a><br />
<a href="http://magazin.c-plusplus.net/artikel/Modernes%20Exception-Handling%20Teil%201%20-%20Die%20Grundlagen" rel="nofollow">http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 1 - Die Grundlagen</a><br />
<a href="http://magazin.c-plusplus.net/artikel/Modernes%20Exception-Handling%20Teil%202%20-%20Hinter%20den%20Kulissen" rel="nofollow">http://magazin.c-plusplus.net/artikel/Modernes Exception-Handling Teil 2 - Hinter den Kulissen</a></p>
<p>Und das beschriebene Problem vom Threadersteller hat definitiv mit dem <code>failbit</code> von <code>std::cin</code> zu tun.<br />
<code>std::ignore</code> sollte man allerdings meiner Meinung nach so benutzen:</p>
<pre><code class="language-cpp">std::cin.ignore(std::cin.rdbuf()-&gt;in_avail());
</code></pre>
<p>Das Problem ist nämlich, dass nicht alle Betriebsysteme als neue Linie den Linefeed nehmen. Soweit ich weiss, hat man in diesem Punkt keine Garantie. Kann mich da aber auch täuschen. Jedenfalls hat man bei meinem Beispiel sicher alles weg, was drin ist, ausser die Standardimplementation ist fehlerhaft, aber dann ist Hopfen und Malz verloren <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>
<p>Im übrigen, man kann auch einen <code>std::cin</code> dazu bringen, dass er bei einem Fehler eine Exception wirft:</p>
<pre><code class="language-cpp">std::cin.exceptions(std::istream::eofbit | std::istream::failbit | std::istream::badbit);
</code></pre>
<p><a href="http://www.cplusplus.com/reference/iostream/ios/exceptions.html" rel="nofollow">http://www.cplusplus.com/reference/iostream/ios/exceptions.html</a></p>
<p>Auf die <code>bool</code> Variable kann man übrigens auch verzichten. Indem man eine Endlosschleife und eine <code>break</code> Anweisung nimmt <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>
<p>Und wenn man noch ganz fanatisch ist, kann man sowas in eine Templatefunktion auslagern, damit man für alle Typen eine entsprechend geprüfte Eingabe hat. Als Parameter kann man dann ein Eingabetext, Fehlertext und als Referenz die zu befüllende Variable übergeben <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615293</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Sat, 15 Nov 2008 20:25:30 GMT</pubDate></item><item><title><![CDATA[Reply to try&#x2F;catch in do&#x2F;while = endlosschleife? on Sun, 16 Nov 2008 09:48:19 GMT]]></title><description><![CDATA[<p>naja hab noch nicht so viel mit exceptions gemacht weil man sie ja eig ganz gut vermeiden kann bei kleineren simplen programmen</p>
<p>naja das failbit ist zwar das fehlerproblem aber er will doch eigendlich exception handling üben...</p>
<p>von daher meinte ich das</p>
<p>PS: und ja meine erste richtige programmiersprache war java xD machen wir derzeitig auch in der schule</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1615406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1615406</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Sun, 16 Nov 2008 09:48:19 GMT</pubDate></item></channel></rss>