<?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[Strings in Exceptions]]></title><description><![CDATA[<p>Hallo! <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>Speichert Ihr (oft) Strings in Euren Exceptions ab?</p>
<p>Wenn ja, wie macht Ihr das: via std::string?</p>
<p>Man trifft auf Beispiele, die dafür std::string benutzten, aber andererseits trifft man auch oft auf den Hinweis, dass man std::strings nicht benutzten soll, da diese selber eine Exception werfen können.</p>
<p>Schreibt Ihr Eure eigene String-Klasse dafür oder habt Ihr keinen Bedarf an Strings in Exceptions, da Meldungen zu den Fehlern eh wo anders erzeugt werden (wo man mehr (Nützliches) zum Fehler sagen kann, und auch what() daher überflüssig ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242397/strings-in-exceptions</link><generator>RSS for Node</generator><lastBuildDate>Sun, 20 Sep 2026 16:04:23 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242397.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 03 Jun 2009 10:35:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 10:35:29 GMT]]></title><description><![CDATA[<p>Hallo! <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>Speichert Ihr (oft) Strings in Euren Exceptions ab?</p>
<p>Wenn ja, wie macht Ihr das: via std::string?</p>
<p>Man trifft auf Beispiele, die dafür std::string benutzten, aber andererseits trifft man auch oft auf den Hinweis, dass man std::strings nicht benutzten soll, da diese selber eine Exception werfen können.</p>
<p>Schreibt Ihr Eure eigene String-Klasse dafür oder habt Ihr keinen Bedarf an Strings in Exceptions, da Meldungen zu den Fehlern eh wo anders erzeugt werden (wo man mehr (Nützliches) zum Fehler sagen kann, und auch what() daher überflüssig ist).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720237</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 03 Jun 2009 10:35:29 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 11:06:11 GMT]]></title><description><![CDATA[<p>Ich denk mal dass es für std::string nur wenige Gelegenheiten gibt wo sie eine Exception werfen, allerdings muss dan schon so weit Land unter sein dass auch die Fehlerbehandlung schwierig wird und ein terminate() nicht mehr groß weh tut <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/1720264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720264</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 03 Jun 2009 11:06:11 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 11:13:56 GMT]]></title><description><![CDATA[<p>Exceptions? Kann man das essen? ... Ok, mal ernsthaft ... Welchen Zweck sollen denn die Strings erfuellen? Da ich sie statisch sind und nur zur Fehlerausgabe dienen reicht meist auch ein (static) const char = &quot;Sie sind auf eine Mine getreten.&quot; aus. Auch musst du dir auch im klaren sein, unter welchen Randbedingungen du programmierst und wie lang der Text ist. String kann nur eine Exception werfen, falls nicht genug Speicher zur Verfuegung steht. Und Speicher fuer Text sollte auf deinem Home Computer heutzutage immer vorhanden sein. Demnach ... mache dir deswegen erstmal keine Gedanken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720270</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720270</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 03 Jun 2009 11:13:56 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 11:28:52 GMT]]></title><description><![CDATA[<p>Ja das stimmt schon. Bis ein std::string eine Exception wirft, muss schon einiges passieren.</p>
<p>Als Anfänger wird man aber auch schnell verwirrt:</p>
<blockquote>
<p>Don't embed a std::string object or any other data member or base class whose copy constructor could throw an exception.</p>
</blockquote>
<p>Quelle: <a href="http://www.boost.org/community/error_handling.html" rel="nofollow">http://www.boost.org/community/error_handling.html</a></p>
<p>Ich mag dieses &quot;Ach, das passt schon...&quot; nicht und außerdem will ich das ja auch nicht nur bei mir zu Hause anwenden.</p>
<p>Daher frage ich lieber mal die Profis von <a href="http://www.c-plusplus.net" rel="nofollow">www.c-plusplus.net</a>, wie die das machen. <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>Ich hatte zunächst den Ansatz eine Basis-Fehlermeldung in den Exceptions zu speichern. Dann aber fragte ich mich, ob das Sinn macht, weil eine viel aussagekräftigere Meldung dort erzeugt wird, wo man fängt. Daher erübrigen sich Strings in Exceptions eh - außer man möchte gewisse Detailinformationen einer Exception mit auf den Weg geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720280</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720280</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 03 Jun 2009 11:28:52 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 11:52:09 GMT]]></title><description><![CDATA[<p>Naja, meistens reicht in der Exception ein <code>char const*</code> . Man übergibt als Meldung dann einfach nur ein Stringliteral. Ein Stringliteral ist ja nicht vom Scope abhängig, daher geht das ganz gut. Zusätzlich Informationen gibt man dann über zusätzliche Parameter an. Also mal ein Beispiel:</p>
<pre><code class="language-cpp">class SyntaxException
  : public std::exception
{
  // Attributes //
private:
  char const* m_message;

  char m_expected;
  char m_found;

  int m_position;

  // Constructor //
public:
  SyntaxException(
    char const* message,
    char expected,
    char found,
    int position)
    : m_message(message)
    , m_expected(expected)
    , m_found(found)
    , m_position(position)
  {
  }

  // Methods //
public:
  virtual char const* what() const { return m_message; }
  char getExpected() const { return m_expected; }
  char getFound() const { return m_found; }
  int getPosition() const { return m_position; }
};

// Verwendung:
throw SyntaxException(
        &quot;XML Syntax exception in Elementattribute&quot;,
        '&quot;', '\'', stream.tellg());

// Falsche Verwendung (nur zum Hinweis, dass es hier eine Gefahr hat):
char message[] = &quot;XML Syntax exception in Elementattribute&quot;;

throw SyntaxException(message, '&quot;', '\'', stream.tellg());
</code></pre>
<p>Die Fehlermeldung kann dann später immer noch angepasst oder verbessert werden. Aber das sollte irgendwo getan werden, wo die Fehlermeldung auch behandelt wird.</p>
<p>Ein <code>std::string</code> in einer Exception ist meistens unnötig.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720299</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720299</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 03 Jun 2009 11:52:09 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 12:07:10 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Naja, meistens reicht in der Exception ein <code>char const*</code> . Man übergibt als Meldung dann einfach nur ein Stringliteral. Ein Stringliteral ist ja nicht vom Scope abhängig, daher geht das ganz gut.</p>
</blockquote>
<p>Stimmt, daran habe ich nicht gedacht. Danke.</p>
<p>Trotzdem mal so als &quot;Umfrage&quot;: Wie macht Ihr das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720313</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720313</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Wed, 03 Jun 2009 12:07:10 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Wed, 03 Jun 2009 12:13:51 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Trotzdem mal so als &quot;Umfrage&quot;: Wie macht Ihr das?</p>
</blockquote>
<p>wie Dravere.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1720320</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1720320</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 03 Jun 2009 12:13:51 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Mon, 08 Jun 2009 13:07:36 GMT]]></title><description><![CDATA[<p>So, nun habe ich bei mir aufgeräumt und die Exceptions auf String-Literale umgestellt.</p>
<p>Das reicht auch in den meisten Fällen. Nun habe ich aber doch schon Stellen wo ich mir einen dynamischen String herbeisehne bzw. nicht weiß, ob ich einen falschen Ansatz verfolge. Wäre nett, wenn Ihr mir nochmal unter die Arme greift:</p>
<p>Ich lese eine Konfiguration ein. Dabei werden oft Parametersätze geladen, die teilweise auch aus indizierten Parametern bestehen.</p>
<p>Simples Beispiel:</p>
<pre><code class="language-cpp">ParamSet Config::ReadParamSet(){

    ParamSet paramSet;
    do{
        paramSet.Add(GetParam(index));
    }
    while(/*noch nicht alle Parameter eingelesen*/);

    return paramSet;
}

Param Config::GetParam(unsigned int paramIndex){ // Hier wäre size_t angebracht, oder?

    Param param;
    // Parameter wird ermittelt...
    if(/*Parameter nicht gefunden?*/){
        throw ParamNotFound(); // Hier möchte ich sagen,
                               // welcher Parameter genau (Index)
                               // nicht gelesen werden konnte
    }
    return param;
}
</code></pre>
<p>Entweder ich übergebe im Konstruktor von ParamNotFound ein std::wstring oder ich leite mir von ParamNotFound eine neue Klasse &quot;ParamXyZNotFound&quot; ab, die ein Parameter-Index im Konstruktor enthält.</p>
<p>Ich benötige das zum Loggen, um sagen zu können welcher Parameter genau fehlt. Ich könnte natürlich auch gleich an Ort und Stelle den Fehler loggen und dann einen allgemeinen ParamNotFound werfen.</p>
<p>Was sagt Ihr dazu?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723249</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Mon, 08 Jun 2009 13:07:36 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 05:40:36 GMT]]></title><description><![CDATA[<p>Prinzipiell würde ich Draveres-Variante nehmen, nur würde das bedeuten, dass ich quasi pro Parametertyp eine eigene Exception-Klasse benötige, um den Parameter zu identifizieren.</p>
<p>1.) Würdet ihr das so machen?</p>
<pre><code class="language-cpp">class ParamANotFound : public ParamNotFound{/*...*/}; // beinhaltet Parameter-A spezifische Daten
class ParamBNotFound : public ParamNotFound{/*...*/}; // beinhaltet Parameter-B spezifische Daten
class ParamCNotFound : public ParamNotFound{/*...*/}; // beinhaltet Parameter-C spezifische Daten
</code></pre>
<p>2.) Oder Logging an Ort und Stelle, wo die Informationen bereit stehen und dann einfach die Aufrufer über ein ParamNotFound informieren? Den Aufrufer interessiert ja eh nicht, welcher einzelner Parameter nun nicht gelesen werden konnte. Er weiß &quot;Ich bekomme keine Daten/habe keine vollständigen Daten&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723596</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723596</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 05:40:36 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 06:35:50 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>also ich muss gestehen, dass ich std::strings in Exceptions ungemein praktisch finde - und deswegen nicht komplett auf sie verzichte.<br />
Ja - ich weiß um die Gefahren, aber gerade in so Situationen wie Deine (Wilco), überwiegen in meiner Einschätzung die Vorteile von std::string (bzw. die Nachteile einer überbordenden &quot;Exceptionklasserei&quot; oder mangelhafter Aussagekraft) in vielen Fällen die Gefahr von fliegenden Exceptions im std::string-Konstruktor.</p>
<p>Ich baue allerdings den string vorher zusammen (üblicherweise via ostringstream) und kopiere ihn anschließend im Exceptionkonstruktor, so dass eine fliegende Exception beim &quot;Stringzusammenbau&quot; noch unter meine Kontrolle fällt.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723609</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723609</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Jun 2009 06:35:50 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 06:57:50 GMT]]></title><description><![CDATA[<blockquote>
<p>Und Speicher fuer Text sollte auf deinem Home Computer heutzutage immer vorhanden sein. Demnach ... mache dir deswegen erstmal keine Gedanken.</p>
</blockquote>
<p>Ich kenn Applikation wo dem nicht zwingend so ist. Da werden in 20s mal 2GB vollgeschrieben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723621</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723621</guid><dc:creator><![CDATA[Tyrdal]]></dc:creator><pubDate>Tue, 09 Jun 2009 06:57:50 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 07:51:40 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn ja, wie macht Ihr das: via std::string?</p>
</blockquote>
<p>Ja, sieht so aus:</p>
<pre><code class="language-cpp">class MyException : public std::exception
{
public:
    explicit MyException(char const* blabla)
    {
        m_text.reset(new std::string(blabla ? blabla : &quot;&quot;));
    }

    virtual char const* what() const
    {
        if (m_text)
            return m_text-&gt;c_str();
        else
            return &quot;(unknown)&quot;;
    }

private:
    boost::shared_ptr&lt;std::string&gt; m_text;
};
</code></pre>
<p>Wenn beim Konstruieren der ursprünglichen Exception ein std::bad_alloc fliegt, ist das egal. Das hat nur zur Folge, dass eine andere Exception fliegt - eben bad_alloc statt was auch immer wir gerade werfen wollte.<br />
Das &quot;Rumreichen&quot; (=Copy-Construction/Assignment) ist no-throw, und das ist es worauf es ankommt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723642</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723642</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 09 Jun 2009 07:51:40 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 08:29:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13960">@hustbaer</a>:</p>
<p>Danke, diese Lösung finde ich gut.<br />
Baust Du Deine Exception-Klassen grundsätzlich nach diesem Schema auf?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723670</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 08:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 09:22:39 GMT]]></title><description><![CDATA[<p>Wenn man statt von std::exception von den exceptions aus &lt;stdexcept&gt; ableitet (z.B. logic_error oder runtime_error), dann kann man denen problemlos einen String als Konstruktorargument übergeben. Beispiel aus dem Quellcode zu meinem aktuellen Artikel:</p>
<pre><code class="language-cpp">struct DivisionDurchNullException : public std::domain_error
{
  explicit DivisionDurchNullException(std::string const&amp; what_arg) : std::domain_error(what_arg) {}
};

//...
    if (n == 0) throw DivisionDurchNullException(&quot;Division durch Null beim Erstellen eines Rational-Objektes.&quot;);
//...
</code></pre>
<p>Hier ist es ähnlich wie bei hustbaers Lösung: wenn beim erzeugen des Strings ein bad_alloc fliegt, dann geschieht das bevor die Exception existiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723703</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723703</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Jun 2009 09:22:39 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 09:32:15 GMT]]></title><description><![CDATA[<p>Wobei diese Exceptions den std::string einfach kopieren und als private Member mitführen. Zumindest in der stdexcept meiner IDE (Visual C++ 6 *bäh*).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723711</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 09:32:15 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 11:20:48 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Wobei diese Exceptions den std::string einfach kopieren und als private Member mitführen.</p>
</blockquote>
<p>Was wiederum zeigt dass die Hersteller deiner Standardbibliothek auch die Auffassung vertreten &quot;wenn die String-Kopie schiefläuft ist eh alles hoffnungslos&quot;.</p>
<blockquote>
<p>Zumindest in der stdexcept meiner IDE (Visual C++ 6 *bäh*).</p>
</blockquote>
<p>Wenn NSVC 6 bäh ist, wieso legst du dir keine aktuellere IDE zu? (z.B. MSVC 2008 Express)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723788</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Jun 2009 11:20:48 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 11:43:49 GMT]]></title><description><![CDATA[<blockquote>
<blockquote>
<p>Zumindest in der stdexcept meiner IDE (Visual C++ 6 *bäh*).</p>
</blockquote>
<p>Wenn NSVC 6 bäh ist, wieso legst du dir keine aktuellere IDE zu? (z.B. MSVC 2008 Express)</p>
</blockquote>
<p>Weil die Personen, denen ich (indirekt) die schwarzen Zahlen auf meinem Kontoauszug zu verdanken habe, das anders sehen wie ich. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<p>Außerdem vertraue ich einer Standardbibliothek, die vor Erscheinen des Standards erstellt wurde, nicht sonderlich. Vor allem bei einer so bekannterweise mangelhaften Umsetzung.</p>
<p>Wenn ich das anspreche, bekomme ich eh wieder zu Hören, dass ich doch MFC nutzen soll, weil das vieeeeel besser sei und viel ausgereifter/mächtiger/intuitiver als die Standardbibliothek... *stöhn*</p>
<p>Ich soll eigentlich auch Klassen-C schreiben, statt OO, weil das viel einfacher/intuitiver/ausgereifter ... (Ich muss mich auch jedesmal überwinden, das vorgeschriebene &quot;Klassen-C-Prefix&quot; zu benutzen. Den lpcwstrVariablenNamen-Blödsinn konnte ich immerhin erfolgreich abwehren.) *stöhn*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723801</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 11:43:49 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 12:18:57 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>...das anders sehen wie ich....</p>
</blockquote>
<p>nooooaaa.... was ist denn das? <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><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/26836">@Topic</a>: Mein herzliches Beileid!!<br />
Kannst Deine &quot;Entscheider&quot; ja mal hier vorbeischicken.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723817</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:18:57 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 12:21:11 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4570">@Roger</a> Wilco,<br />
In eine Exception kommt keine Fehlerbeschreibung, sondern nur Fehlerdaten. Den String, welchen man übergibt, sollte meiner Meinung nach eher einem Titel oder Betreff gleichen.</p>
<p>Wenn du einen Index durchreichen willst, dann reich auch den Index durch. Wandle ihn sicher nicht vor dem durchreichen in einen String um. Wieso erweiterst du nicht gleich <code>ParamNotFound</code> , um eine Möglichkeit einen Index zu übergeben? Oder wird die Exception auch noch für etwas anderes verwendet? Wenn dem so ist, dann machst du halt noch eine <code>IndexedParamNotFound</code> , welche einen Index bekommt.</p>
<p>Die Exception ist nur für den Fehler verantwortlich, der Exceptionwerfer nur für die Fehlerbenachrichtigung, die Fehlerbeschreibung oder was auch immer am Ende mit dem Fehler passieren soll, darum hat sich der Fänger zu kümmern.</p>
<p>Und im übrigen: Mein Beileid, dass du solche Arbeitsgeber hast <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/1723818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723818</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:21:11 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 12:36:37 GMT]]></title><description><![CDATA[<p>@RogerWilco, da hilfts nur eins: Informier dich, bilde dich weiter und sei gut in dem was du tust, und zwar so dass die Schlipsträger irgendwann schnallen dass du davon mehr Ahnung hast als sie.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723833</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 12:39:32 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Kannst Deine &quot;Entscheider&quot; ja mal hier vorbeischicken.</p>
</blockquote>
<p>*hehe* Wenn ich bei Problemen vorschlage (was ich manchmal tue) mal im Internet und in Foren wie dieses hier nachzusehen oder mal nachzufragen, dann ist die Antwort:</p>
<p>&quot;Das sind nur Freaks! Machen immer aus einer Mücke einen Elefanten und schießen mit Kanonen auf Spatzen! Das geht alles viel einfacher und unkomplizierter! Wir schauen nochmal in der (mitgelieferten!) MSDN nach (zum 1000x und finden wieder keine Lösung)!&quot; (zwar kein O-Ton, aber der Inhalt stimmt wirklich!)</p>
<p>Aber genug Off-Topic...</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>: So sehe ich das eigentlich auch, und wollte den Index eben haben, um (später) den Fehler zu beschreiben (loggen). Nur wusste ich nicht, ob es sinnig ist, für jeden Parametertyp eine eigene Exception-Klasse abzuleiten.</p>
<p>Ihr erkennt aufgrund Eurer Erfahrung viel schneller, wenn irgendwas in Richtung Design-Fehler läuft, daher fragte ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723836</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723836</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:39:32 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 12:52:54 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>@RogerWilco, da hilfts nur eins: Informier dich, bilde dich weiter und sei gut in dem was du tust, und zwar so dass die Schlipsträger irgendwann schnallen dass du davon mehr Ahnung hast als sie.</p>
</blockquote>
<p>Mit dieser Aussage wäre ich vorsichtig. Gerade wenn diese eingestaubten Meinungen zur Programmierung herrschen. Manchmal ist es in so einer Firma sinnvoller sich weiterzubilden und dann eine andere Firma zu suchen (Wenn Leistungen und Fähigkeiten nicht in irgendeiner Weise gewürdigt werden [das muss nicht zwangsweise Geld sein], braucht eine Firma einen auch nicht).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723842</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723842</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:52:54 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 14:00:06 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9752">@Dravere</a>: So sehe ich das eigentlich auch, und wollte den Index eben haben, um (später) den Fehler zu beschreiben (loggen). Nur wusste ich nicht, ob es sinnig ist, für jeden Parametertyp eine eigene Exception-Klasse abzuleiten.</p>
</blockquote>
<p>Was ist ein Parametertyp? Wie sieht das Design aus? Es ist ziemlich schwer hier zu sagen, ob man mehrere Klassen erstellen sollte oder nicht.<br />
Im allgemeinen sagt man aber, nicht zu viel und nicht zu wenig <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="😉"
    /><br />
Oft kann man viele Informationen als Variablen in eine Exception packen. Sagt zum Beispiel der Index nicht schon etwas über den Parametertyp aus? Wie kann man einen Parametertyp bezeichnen? Womöglich ein zusätzliches Stringliteral? Und die wichtige Frage: Ist es überhaupt wichtig zu wissen, welcher Parametertyp es war?</p>
<p>Bemerkung am Rande: Unterschätzt niemals Freaks! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723880</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 14:00:06 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 14:46:15 GMT]]></title><description><![CDATA[<p>Roger Wilco schrieb:</p>
<blockquote>
<p>Wobei diese Exceptions den std::string einfach kopieren und als private Member mitführen. Zumindest in der stdexcept meiner IDE (Visual C++ 6 *bäh*).</p>
</blockquote>
<p>VC6 verwendet AFAIK COW für std::string. Was zwar grundsätzlich schlecht ist, aber es ermöglicht, no-throw Kopien von Strings zu machen. Sogesehen ist das bei MSVC 6 auch kein Problem.<br />
Und ab 7.1/8 (die kein COW mehr für std::string verwenden) sind die Exception Klassen dann auch anders implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723910</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723910</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 09 Jun 2009 14:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 15:02:04 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Was ist ein Parametertyp? Wie sieht das Design aus?</p>
</blockquote>
<p>Mein &quot;ConfigReader&quot; ist eine Fabrik, die mir unterschiedliche Objekte liefert, die Daten aus einer Config-Datei oder Registry benötigen.</p>
<p>Vereinfachtes Beispiel, das dem Prinzip aber entspricht:</p>
<p>Parameter &quot;LKW&quot; (mit Bierkisten): Klasse LKW, Klasse Bierkasten, Klasse Bierflasche.</p>
<pre><code>config.ini:
[LKW_1]
AnzahlBierkisten=3
FlaschenInBierkiste_1= 12 // Bin kein Biertrinker, was gibt es da für Größen?
FlaschenInBierkiste_2= 24
FlaschenInBierkiste_3= &amp;  // *Ups* da hat sich wohl einer vertippt...
Biersorte=Lieblingsbier
[LKW_2]
...
</code></pre>
<p>Innerhalb der Fabrik, werden die einzelnen Parameter-Objekte über Fabrikmethoden geladen. Ich möchte nun in meiner Fehlerbeschreibung stehen haben:</p>
<blockquote>
<p>... ERROR: Konfigurationsfehler: LKW 1: Viel zu wenig Bier geladen!</p>
</blockquote>
<p>Ach Quatsch...</p>
<blockquote>
<p>... ERROR: Konfigurationsfehler: LKW 1/Bierkiste 3/Anzahl Bierflaschen: Parameter nicht vorhanden oder fehlerhaft!</p>
</blockquote>
<p>So in der Art...</p>
<p>Dravere schrieb:</p>
<blockquote>
<p>Unterschätzt niemals Freaks! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
</blockquote>
<p><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="🙂"
    /> ICH tue das bestimmt nicht! Verstehe noch lange nicht alles hier im Forum und habe schon viel (mehr wie im Studium, würde ich behaupten) über sinniges C++ Programmieren gelernt! Vielen Dank an dieser Stelle für die ausgezeichnete Unterstützung! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723923</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723923</guid><dc:creator><![CDATA[Roger Wilco]]></dc:creator><pubDate>Tue, 09 Jun 2009 15:02:04 GMT</pubDate></item><item><title><![CDATA[Reply to Strings in Exceptions on Tue, 09 Jun 2009 15:57:52 GMT]]></title><description><![CDATA[<p>Mal deine Fehlermeldung auseinandernehmen:</p>
<pre><code>... ERROR: Konfigurationsfehler: LKW 1/Bierkiste 3/Anzahl Bierflaschen: Parameter nicht vorhanden oder fehlerhaft!
|              1                |  2  |     3     |                      4                                       |
</code></pre>
<ul>
<li>Teil 1: Das kann der Fänger dazufügen.</li>
<li>Teil 2: <code>int lkw</code> -&gt; könnte man über eine Variable lösen.</li>
<li>Teil 3: <code>int bierkiste</code> -&gt; könnte man über eine Variable lösen.</li>
<li>Teil 4: Title/Betreff, also durch ein Stringliteral lösbar. Könnte man vielleicht noch weiter unterteilen.</li>
</ul>
<p>Das ist vielleicht möglich, hängt alles von deinem Code ab und was du alles genau wie rausparst.<br />
Allerdings würde ich die Sache sowieso ein wenig anders anpacken. Das Configfile muss einer bestimmten Grammatik folgen, nehme ich an. Ich würde daher eher das ganze auseinander nehmen, um es danach besser bearbeiten oder lesen zu können und dabei die Grammatik prüfen. Somit dann eher einen Gramatikfehler werfen mit Zeilen- und Zeichennummer.<br />
Wenn die Grammatik stimmt und das File entsprechend zerlegt wurde, dann kannst du anfangen die Konfiguration auf deine Klassen zu übertragen.</p>
<p>Ist auch alles ein wenig relativ und kommt ganz auf den entsprechenden Fall an <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="🙂"
    /><br />
Und ich will hier jetzt auch nicht völlig gegen <code>std::string</code> in einer Exception sein, man sollte halt nur bei der Verwendung von <code>std::string</code> aufpassen, dass man die Fehlerbeschreibung nicht am falschen Ort generiert, also dass die Aufgaben korrekt getrennt sind. Das ein <code>std::string</code> eine Exception wirft, ist ziemlich unwahrscheinlich und wenn, dann ist es meistens &quot;egal&quot;, wie hier schon mehrfach gesagt wurde.</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723954</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723954</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 09 Jun 2009 15:57:52 GMT</pubDate></item></channel></rss>