<?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[Vorgehensweise bei falschen Parametern]]></title><description><![CDATA[<p>Hallo Leute wie sollte man bei einer Eingabe von falschen Parametern vorgehen?</p>
<pre><code class="language-cpp">class A{
 private:
  unsigned int a;
  ...
 public:
  A();
  A(unsigned int a);
  ...
}

A::A(unsigned int a){

 if(a){
  // Was soll hier getan werden?
 }
}
</code></pre>
<p>Ich kann mit Sicherheit behaupten dass im Konstrutor mit Parametern das Argument größer als Null sein muss. Was soll ich am besten machen wenn doch eine Null übergeben wird?</p>
<p>Destruktor aufrufen?</p>
<p>Bei der Standardinitialisierung setze ich alle Werte auf Null. Damit kann kann ich sehen dass die Klasse noch nicht brauchbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/269987/vorgehensweise-bei-falschen-parametern</link><generator>RSS for Node</generator><lastBuildDate>Sun, 30 Aug 2026 19:01:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/269987.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 05 Jul 2010 07:41:35 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:41:35 GMT]]></title><description><![CDATA[<p>Hallo Leute wie sollte man bei einer Eingabe von falschen Parametern vorgehen?</p>
<pre><code class="language-cpp">class A{
 private:
  unsigned int a;
  ...
 public:
  A();
  A(unsigned int a);
  ...
}

A::A(unsigned int a){

 if(a){
  // Was soll hier getan werden?
 }
}
</code></pre>
<p>Ich kann mit Sicherheit behaupten dass im Konstrutor mit Parametern das Argument größer als Null sein muss. Was soll ich am besten machen wenn doch eine Null übergeben wird?</p>
<p>Destruktor aufrufen?</p>
<p>Bei der Standardinitialisierung setze ich alle Werte auf Null. Damit kann kann ich sehen dass die Klasse noch nicht brauchbar ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921395</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:41:35 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:44:33 GMT]]></title><description><![CDATA[<p>assert(a &gt; 0);</p>
<p>Oder eine Exception werfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921396</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921396</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:44:33 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:45:50 GMT]]></title><description><![CDATA[<p>Exception werfen oder ein assert(a) einbauen und dafür sorgen, dass nie 0 übergeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921397</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:45:50 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:48:37 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>assert(a &gt; 0);<br />
Oder eine Exception werfen.</p>
</blockquote>
<p>Sowas ähnliches hatte ich auch im Sinn.<br />
Assert geht leider nur im DEBUG Modus.</p>
<p>Ich habe in einer übergeordneten Schleife ein bool flag, der im Moment mein Fehlerindikator ist, könnte ich ihn mit einer exception setzen?</p>
<pre><code class="language-cpp">while(flag){
 ...
 A tmpa;
 tmpa.set_a(...);
 ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1921400</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921400</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:48:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:51:46 GMT]]></title><description><![CDATA[<p>Du brauchst keinen Fehlerindikator.</p>
<pre><code class="language-cpp">if(a &gt; 0)
    throw(AZuGrossException(&quot;A zu groß!&quot;));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1921406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921406</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:51:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:53:06 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>Du brauchst keinen Fehlerindikator.</p>
<pre><code class="language-cpp">if(a &gt; 0)
    throw(AZuGrossException(&quot;A zu groß!&quot;));
</code></pre>
</blockquote>
<p>Möchte aber das Programm danach nicht unterbrechen sondern dem Nutzer eine Möglichkeit geben es zu beheben, durch eingabe eines neuen Wertes oder zumindest durch einen Bericht wo was schiefgelaufen ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921408</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921408</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:57:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">bool ok = false;
do
{
    try
    {
        eingabe_die_evtl_exception_wirft();
        ok = true;
    }
    catch(AZuGrossException&amp; fehler)
    {
       ok = false;
    }
} while(!ok)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1921412</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921412</guid><dc:creator><![CDATA[Nukularfüsiker]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:57:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:58:57 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<p>Du brauchst keinen Fehlerindikator.</p>
<pre><code class="language-cpp">if(a &gt; 0) throw(AZuGrossException(&quot;A zu groß!&quot;));
</code></pre>
</blockquote>
<p>Hab mich kurz durch exceptions durchgelesen... damit müsste es gehen, weil ich die Exception in der übergeordneten Schleife abfangen kann. Oder liege ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921413</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921413</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:58:57 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 07:59:46 GMT]]></title><description><![CDATA[<p>Nukularfüsiker schrieb:</p>
<blockquote>
<pre><code class="language-cpp">bool ok = false;
do
{
    try
    {
        eingabe_die_evtl_exception_wirft();
        ok = true;
    }
    catch(AZuGrossException&amp; fehler)
    {
       ok = false;
    }
} while(!ok)
</code></pre>
</blockquote>
<p>Dankeschön!<br />
Hat mich super weitergebracht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921416</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921416</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 07:59:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 08:03:37 GMT]]></title><description><![CDATA[<p>Wenn die Werte vom Benutzer eingegeben werden, dann solltest du diese Eingaben überprüfen, <em>bevor</em> du versuchst, ein Objekt mir sinnfreien Werten zu initialisieren. Es ist vermutlich nicht Aufgabe der Klasse A, Benutzereingaben zu überprüfen, sondern du benutzt die Klasse zu einem anderen Zweck, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921422</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921422</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Jul 2010 08:03:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 08:18:29 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Wenn die Werte vom Benutzer eingegeben werden, dann solltest du diese Eingaben überprüfen, <em>bevor</em> du versuchst, ein Objekt mir sinnfreien Werten zu initialisieren. Es ist vermutlich nicht Aufgabe der Klasse A, Benutzereingaben zu überprüfen, sondern du benutzt die Klasse zu einem anderen Zweck, oder?</p>
</blockquote>
<p>Die Werte werden in diesem Teil aus einer Datei gelesen.<br />
Da diese auch manuell im klartext erstellt werden kann, möchte ich die fehler möglichst einfach abfangen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921431</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 08:18:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 08:49:20 GMT]]></title><description><![CDATA[<p>waldfee schrieb:</p>
<blockquote>
<p>Die Werte werden in diesem Teil aus einer Datei gelesen.<br />
Da diese auch manuell im klartext erstellt werden kann, möchte ich die fehler möglichst einfach abfangen.</p>
</blockquote>
<p>Ob der Benutzer einen Wert in die Kommandozeile oder eine GUI oder eine Textdatei eingibt, die dann ausgelesen wird, ist egal. Nur sollte die Überprüfung der Richtigeit der Werte im Normalfall nicht von der Klasse ausgeführt werden, die mit den Werten arbeitet, sondern von der Klasse, die die Werte einliest (aus der Datei, der Konsole oder der GUI).</p>
<p>Siehe auch &quot;separation of concerns&quot; und &quot;single responsibility principle&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921444</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921444</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 05 Jul 2010 08:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 12:09:25 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Ob der Benutzer einen Wert in die Kommandozeile oder eine GUI oder eine Textdatei eingibt, die dann ausgelesen wird, ist egal. Nur sollte die Überprüfung der Richtigeit der Werte im Normalfall nicht von der Klasse ausgeführt werden, die mit den Werten arbeitet, sondern von der Klasse, die die Werte einliest (aus der Datei, der Konsole oder der GUI).</p>
<p>Siehe auch &quot;separation of concerns&quot; und &quot;single responsibility principle&quot;</p>
</blockquote>
<p>Ich habe es jetzt von der praktischen Seite gesehen. Diese Klasse wird in einigen Programmen verwendet und einfach dazugebunden. Dann müssten (die anderen) Basisprogramme ihr eigenes Süppchen bei der Parameterübergabe kochen.</p>
<p>Ich glaube dass ich besser dran bin wenn ich dafür funktionen anbiete. Habe auch einen low-level Modus der keine Abfragen macht, falls es mal benötigt wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921589</guid><dc:creator><![CDATA[waldfee]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:09:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 12:26:10 GMT]]></title><description><![CDATA[<p>Wenn du derartiges Verhalten öfter brauchst, schlage ich eine Funktionsvorlage vor. In etwa</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;sstream&gt;
#include &lt;string&gt;
#include &lt;tr1/functional&gt;

template&lt;typename T&gt; bool always_true(T const &amp;) { return true; }

template&lt;typename T&gt;
T read_retry(std::string                         const &amp;prompt    = &quot;&quot;,
             std::tr1::function&lt;bool(T const &amp;)&gt; const &amp;predicate = always_true&lt;T&gt;,
             std::istream                              &amp;in        = std::cin,
             std::ostream                              &amp;out       = std::cout)
{
  std::istringstream parser;
  std::string line;
  T result;

  do {
    out &lt;&lt; prompt;
    std::getline(in, line);

    parser.clear();
    parser.str(line);
    parser &gt;&gt; result;
  } while(!parser || !predicate(result));

  return result;
}

bool greater_than_zero(unsigned x) { return x &gt; 0; }

int main() {
  unsigned x = read_retry&lt;unsigned&gt;(&quot;Zahl &gt; 0 eingeben: &quot;, greater_than_zero);
  unsigned y = read_retry&lt;unsigned&gt;(&quot;Zahl eingeben: &quot;);

  std::cout &lt;&lt; x + y &lt;&lt; std::endl;
}

// Ausgabe (Beispiel):
//
// Zahl &gt; 0 eingeben: abc
// Zahl &gt; 0 eingeben: 0
// Zahl &gt; 0 eingeben: 2
// Zahl eingeben: foo
// Zahl eingeben: 3
// 5
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1921601</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921601</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Mon, 05 Jul 2010 12:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vorgehensweise bei falschen Parametern on Mon, 05 Jul 2010 15:34:30 GMT]]></title><description><![CDATA[<p>@ waldfee:<br />
Bitte <strong>nie</strong> Programmierfehler mit Exceptions behandeln. Damit sind Logikfehler gemeint, die bei einer korrekten Implementierung des Codes nicht vorkommen. Also Dinge wie</p>
<pre><code class="language-cpp">strlen(NULL);
</code></pre>
<p>Nimm <code>assert</code> in den Setter und du wirst sofort auf das Problem aufmerksam. Das kostet im Release-Modus auch keine Performance.</p>
<p>Wenn dein Fehler hingegen ein Laufzeitfehler ist, der auch bei korrektem Code vorkommen kann (z.B. Datei konnte nicht geöffnet werden), nimm Exceptions. Auf so einen Fehler muss auch ein Release-Kompilat reagieren können. Aber hier denke ich wie pumuckl, dass die Benutzereingabe an anderer Stelle zuerst geprüft werden sollte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1921741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1921741</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Jul 2010 15:34:30 GMT</pubDate></item></channel></rss>