<?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[Eigene Fehlerklasse]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mir eine eigene Fehlerklasse erzeugt und wollte mal fragen ob das aus C++ Sicht so in Ordnung ist oder ob ich da noch ein Problem habe, z.B. das die Fehlermeldungen unter public stehen (oder kann man das so lassen), oder was auch immer ? Funktionieren tut es jedenfalls.</p>
<p>*.h Datei</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#ifndef ErrorClassH
#define ErrorClassH

const int MAXMSG = 10;

class MyException
{
 private:
 public:
	AnsiString sErrorMessage[MAXMSG];
	__fastcall MyException();
	virtual AnsiString __fastcall showError() = 0;
};

class InterpreterError : public MyException
{
 private:
	int nr;
 public:
	__fastcall InterpreterError(int a);
	AnsiString __fastcall showError();
};

class UndefinedError : public MyException
{
 private:
 public:
	__fastcall UndefinedError();
	AnsiString __fastcall showError();
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>*.cpp Datei</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;ErrorClass.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
using namespace std;

__fastcall MyException::MyException()
{
 sErrorMessage[0] = &quot;Error bla bla&quot;;
 sErrorMessage[1] = &quot;Error bla bla bla&quot;;
 // ...
 // etc.
}
//---------------------------------------------------------------------------

__fastcall InterpreterError::InterpreterError( int a )
{
 nr = a;
 if ( nr &gt;= MAXMSG ) nr = 0;
}

AnsiString __fastcall InterpreterError::showError()
{
 return sErrorMessage[nr];
}
//---------------------------------------------------------------------------

__fastcall UndefinedError::UndefinedError()
{
}

AnsiString __fastcall UndefinedError::showError()
{
 return &quot;Undefined Error&quot;;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Viele Dank schon mal für eure Tips.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/231069/eigene-fehlerklasse</link><generator>RSS for Node</generator><lastBuildDate>Sat, 26 Sep 2026 00:30:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/231069.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 06 Jan 2009 12:24:04 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 12:24:04 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe mir eine eigene Fehlerklasse erzeugt und wollte mal fragen ob das aus C++ Sicht so in Ordnung ist oder ob ich da noch ein Problem habe, z.B. das die Fehlermeldungen unter public stehen (oder kann man das so lassen), oder was auch immer ? Funktionieren tut es jedenfalls.</p>
<p>*.h Datei</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#ifndef ErrorClassH
#define ErrorClassH

const int MAXMSG = 10;

class MyException
{
 private:
 public:
	AnsiString sErrorMessage[MAXMSG];
	__fastcall MyException();
	virtual AnsiString __fastcall showError() = 0;
};

class InterpreterError : public MyException
{
 private:
	int nr;
 public:
	__fastcall InterpreterError(int a);
	AnsiString __fastcall showError();
};

class UndefinedError : public MyException
{
 private:
 public:
	__fastcall UndefinedError();
	AnsiString __fastcall showError();
};
//---------------------------------------------------------------------------
#endif
</code></pre>
<p>*.cpp Datei</p>
<pre><code class="language-cpp">//---------------------------------------------------------------------------
#include &lt;vcl.h&gt;
#include &lt;iostream&gt;
#pragma hdrstop

#include &quot;ErrorClass.h&quot;
//---------------------------------------------------------------------------
#pragma package(smart_init)
using namespace std;

__fastcall MyException::MyException()
{
 sErrorMessage[0] = &quot;Error bla bla&quot;;
 sErrorMessage[1] = &quot;Error bla bla bla&quot;;
 // ...
 // etc.
}
//---------------------------------------------------------------------------

__fastcall InterpreterError::InterpreterError( int a )
{
 nr = a;
 if ( nr &gt;= MAXMSG ) nr = 0;
}

AnsiString __fastcall InterpreterError::showError()
{
 return sErrorMessage[nr];
}
//---------------------------------------------------------------------------

__fastcall UndefinedError::UndefinedError()
{
}

AnsiString __fastcall UndefinedError::showError()
{
 return &quot;Undefined Error&quot;;
}
//---------------------------------------------------------------------------
</code></pre>
<p>Viele Dank schon mal für eure Tips.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640349</guid><dc:creator><![CDATA[Trial]]></dc:creator><pubDate>Tue, 06 Jan 2009 12:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 12:56:42 GMT]]></title><description><![CDATA[<p>Hallo einzelner,</p>
<p>sehr strange die Klasse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640367</guid><dc:creator><![CDATA[Eigene Fehlerklasse]]></dc:creator><pubDate>Tue, 06 Jan 2009 12:56:42 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 13:12:35 GMT]]></title><description><![CDATA[<p>Trial schrieb:</p>
<blockquote>
<p>ich habe mir eine eigene Fehlerklasse erzeugt und wollte mal fragen ob das aus C++ Sicht so in Ordnung ist...</p>
</blockquote>
<p>Im ersten Moment sollte dir erstmal bewusst sein das du hier kein AnsiC++ verwendest (Das VCL/C++ Builder-Forum wäre die bessere Wahl gewesen).</p>
<p>Aufgrund eigener Erfahrungen, würde ich bestimmte Notationen vom C++ Builder auch bei eigenen Klassen vermeiden, sofern diese nicht von einer VCL-Klasse abgeleitet sind. So beispielsweise __fastcall, weil dies nicht mit den C++ Sprachmitteln wirklich gut läuft (Zumindestens hatte ich Probleme mit umgedrehten Konstruktorreihenfolgen, inkompatibilitäten zu std::tr1::function etc.).</p>
<p>In der VCL-Hierachie sieht das ganze wieder anders aus.</p>
<p>Trial schrieb:</p>
<blockquote>
<p>oder ob ich da noch ein Problem habe, z.B. das die Fehlermeldungen unter public stehen (oder kann man das so lassen), oder was auch immer ? Funktionieren tut es jedenfalls.</p>
</blockquote>
<p>Grundsätzlich würde ich public-Eigenschaften meiden. Zumindestens wenn du später noch Änderungen vornehmen willst, sind Getter/Setter etc. eine bessere Wahl.</p>
<p>Zudem würde ich grundsätzlich Eigenschaften dort ansiedeln, wo sie verwendet werden, und nicht zwangsweise in eine Basisklasse verschieben, nur weil man sich dort Schreibaufwand spart. UndefinedError verwendet beispielsweise kein sErrorMessage (Meine negative Meinung zu der ungarischen Notation lasse ich hier mal beiseite).</p>
<p>Davon abgesehen ist sErrorMessage wohl nur für die Hierachie gedacht, daher ohnehin als public-Member falsch (und wenn würde ich hier nur das Lesen ermöglichen).</p>
<p>Zudem würde ich (aber nur als Ergänzung gesagt) statt einem C-Array eher std::tr1::array/boost::array verwenden, da dies bei dir zudem noch Klassen nicht Objektbezogen ist: statisch. Vielleicht wäre auch eine std::map noch besser aufgehoben, zumindestens wenn die Fehlernummern &quot;Lücken&quot; haben können.</p>
<p>Und zudem noch weitere Anmerkungen:<br />
- Stilistisch -<br />
1. Sinnvolle Einrückungsebenen verwenden (1 Zeichen halte ich arg wenig)<br />
2. Jede Anweisung in eine eigene Zeile schreiben, und die Einrückungen beachten.<br />
1&amp;2 erhöhen die Lesbarkeit (s.u.)<br />
3. Du solltest dir mal Initialisierungslisten von Konstruktoren anschauen (Innerhalb des Konstruktorrumpfes werden nur Zuweisungen, nicht Initialisierungen gemacht, die Initialisierung erfolgt im Konstruktorrumpf. In deinen aktuellen Fall noch relativ egal, kann dies später mal relevant sein [Direkte Konstruktoraufrufe, Konstanteninitialisierungen, Referenzzuweisungen...]).</p>
<pre><code class="language-cpp">__fastcall InterpreterError::InterpreterError(int a)
:   nr(a) // Initialisierungsliste
{
    if ( nr &gt;= MAXMSG ) // Erste Einrückungsebene
        nr = 0;         // Gehört zum if-Block, daher weitere Einrückung
}
</code></pre>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640374</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 06 Jan 2009 13:12:35 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 13:32:31 GMT]]></title><description><![CDATA[<p>Trial schrieb:</p>
<blockquote>
<p>ich habe mir eine eigene Fehlerklasse erzeugt und wollte mal fragen ob das aus C++ Sicht so in Ordnung ist</p>
</blockquote>
<p>Exception-Klassen sollten mindestens von std::exception ableiten. Wenn du dir das manuelle Verwalten des Speichers für eine bereits im Konstruktor zusammengesetzte Fehlermeldung sparen willst, kannst du auch z.B. von std::runtime_error ableiten.</p>
<p>Das Visualisieren der Fehlermeldung ist außerdem nicht Aufgabe einer Exception-Klasse, sondern der Umgebung, die sie benutzt; showError() hat in MyException eigentlich nichts zu suchen.</p>
<p>Zu allem anderen hat asc sich schon ausführlich geäußert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640385</guid><dc:creator><![CDATA[audacia]]></dc:creator><pubDate>Tue, 06 Jan 2009 13:32:31 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 15:27:32 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>erstmal vielen Dank für Eure Tips, die helfen mir prima weiter. Ein paar Fragen habe ich noch:</p>
<p>asc schrieb:</p>
<blockquote>
<p>std::tr1::function</p>
</blockquote>
<p>Was bedeutet hier <strong>tr1</strong> ?</p>
<p>asc schrieb:</p>
<blockquote>
<p>Vielleicht wäre auch eine std::map noch besser aufgehoben, zumindestens wenn die Fehlernummern &quot;Lücken&quot; haben können.</p>
</blockquote>
<p>Und dann die std::exception zu nehmen oder wie meinst Du das ?</p>
<p>asc schrieb:</p>
<blockquote>
<p>3. Du solltest dir mal Initialisierungslisten von Konstruktoren anschauen (Innerhalb des Konstruktorrumpfes werden nur Zuweisungen, nicht Initialisierungen gemacht, die Initialisierung erfolgt im Konstruktorrumpf. In deinen aktuellen Fall noch relativ egal, kann dies später mal relevant sein [Direkte Konstruktoraufrufe, Konstanteninitialisierungen, Referenzzuweisungen...]).</p>
<pre><code class="language-cpp">__fastcall InterpreterError::InterpreterError(int a)
:   nr(a) // Initialisierungsliste
{
    if ( nr &gt;= MAXMSG ) // Erste Einrückungsebene
        nr = 0;         // Gehört zum if-Block, daher weitere Einrückung
}
</code></pre>
</blockquote>
<p>Das war ein guter Tip <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="🙂"
    /> , war mir nicht bekannt.</p>
<p>audacia schrieb:</p>
<blockquote>
<p>Exception-Klassen sollten mindestens von std::exception ableiten.</p>
</blockquote>
<p>Kannst Du mir das näher erklären ? Was spricht gegen einen eigene Klasse ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640455</guid><dc:creator><![CDATA[Trial]]></dc:creator><pubDate>Tue, 06 Jan 2009 15:27:32 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 15:43:06 GMT]]></title><description><![CDATA[<p>Trial schrieb:</p>
<blockquote>
<p>erstmal vielen Dank für Eure Tips, die helfen mir prima weiter. Ein paar Fragen habe ich noch:</p>
<p>asc schrieb:</p>
<blockquote>
<p>std::tr1::function</p>
</blockquote>
<p>Was bedeutet hier <strong>tr1</strong> ?</p>
</blockquote>
<p>TR1 (Technical Report 1) ist eine Erweiterung zum C++ Standard von 1998.<br />
Für dich wird das aktuell wohl noch nicht von Bedeutung sein, ist nur als Vorgriff zu sehen (Da der nächste Standard so langsam Gestalt annimmt, wird der tr1 in wohl nicht mehr ewiger Zeit auch Bestandteil vom std-Namensraum; Aber das dauert auch noch ein paar Jahre).</p>
<p>Trial schrieb:</p>
<blockquote>
<p>asc schrieb:</p>
<blockquote>
<p>Vielleicht wäre auch eine std::map noch besser aufgehoben, zumindestens wenn die Fehlernummern &quot;Lücken&quot; haben können.</p>
</blockquote>
<p>Und dann die std::exception zu nehmen oder wie meinst Du das ?</p>
</blockquote>
<p>Das war bezogen auf dein Array mit den Fehlertexten nicht auf std::exception. Ich halte von den C-Arrays recht wenig (manchmal mögen sie Sinn machen, es gibt aber meist bessere Alternativen).</p>
<p>Du hast derzeit ein Array, aus dem du die Fehlermeldungen über einen Index ausliest. Wenn dieser Index auch Lücken enthalten kann, wäre eine Map besser. So kenne ich z.B. etliche Compiler die &quot;Lücken&quot; bei ihren Fehlernummern haben. std::map ist ein Container mit Einträgen in der Form &lt;Schlüssel, Wert&gt;, hier wäre der Schlüssel die Fehlernummer und der Wert der Fehlertext.</p>
<p>Trial schrieb:</p>
<blockquote>
<p>audacia schrieb:</p>
<blockquote>
<p>Exception-Klassen sollten mindestens von std::exception ableiten.</p>
</blockquote>
<p>Kannst Du mir das näher erklären ? Was spricht gegen einen eigene Klasse ?</p>
</blockquote>
<p>1. Wiederverwertung von Code ist meist besser als Neuschreiben<br />
2. Einheitliche Exceptionbehandlung<br />
...</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640467</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640467</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Tue, 06 Jan 2009 15:43:06 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 16:01:04 GMT]]></title><description><![CDATA[<p>Vielen Dank für deine Antworten André,</p>
<p>diesen Brocken habe ich aber noch nicht geschluckt:</p>
<p>asc schrieb:</p>
<blockquote>
<p>1. Wiederverwertung von Code ist meist besser als Neuschreiben<br />
2. Einheitliche Exceptionbehandlung</p>
</blockquote>
<p>Wenn wir mal von Arrays und maps absehen, dann ist &quot;das Neuschreiben&quot; ja kein großer Aufwand, wenn ich jetzt meine paar Zeilen betrachte, und mehr braucht man ja nicht (bis auf die Fehlerbeschreibungen) ?! Und von try/catch her gesehen ist die Behandlung doch auch gleich ?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640484</guid><dc:creator><![CDATA[Trial]]></dc:creator><pubDate>Tue, 06 Jan 2009 16:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 16:06:34 GMT]]></title><description><![CDATA[<p>Punkt 1 sehe ich auch nicht so kritisch. Punkt 2 aber schon.<br />
Das problem ist hier, wenn du eine Exception fangen willst und Informationen davon benötigst, dann musst du acu den typ der Exception (oder deren basisklasse) in catch mit angeben.<br />
Ein</p>
<pre><code class="language-cpp">catch(std::exception&amp; e)
</code></pre>
<p>würde aber deine Exceptionklasse nicht fangen. Wenn von std::exception abgeleitet wäre aber schon.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640490</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640490</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 06 Jan 2009 16:06:34 GMT</pubDate></item><item><title><![CDATA[Reply to Eigene Fehlerklasse on Tue, 06 Jan 2009 16:46:18 GMT]]></title><description><![CDATA[<p>OK, ist mir jetzt klarer was mit Punkt 2 gemeint ist. Ich bin davon ausgegangen, das ich meinen catch Block als ersten nehme und den &quot;std:exception&amp; e&quot; oder die 3 Punkte als 2. hintendran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640525</guid><dc:creator><![CDATA[Trial]]></dc:creator><pubDate>Tue, 06 Jan 2009 16:46:18 GMT</pubDate></item></channel></rss>