<?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 und catch sinnvoll einsetzen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine C-Wrapper für einen Labview Interface gechrieben.<br />
Die Interface an sich funktioniert einwandfrei, nun gefehlt es mir nicht wie die C-Wrapper implementiert ist.</p>
<p>Bei jede exportierte Funktion wird eine try und catch eigesetzt, was nicht unbedingt der Sinn der OOP ist.<br />
Einen Beispiel:</p>
<pre><code>/* Headder*/
// MeasureStart ist die gewrapperte Class
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref);
</code></pre>
<pre><code>/*cpp*/
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref)
{
	int Error = 0;
	try
	{
		LV_ref-&gt;MeasureCont();
	}
	catch(QString &amp;msg)
	{
		// hier wird eine Nummer zu den Fehler gegeben 
		// z.B
		Error = 5006;
	}
	return Error;
}
....
</code></pre>
<p>// und diese try und catch wiederholt sich bei alle exportierte Funktionen</p>
<p>Meine Frage wie kann ich das besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/337205/try-und-catch-sinnvoll-einsetzen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 08:25:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337205.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Mar 2016 07:07:46 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 07:07:46 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine C-Wrapper für einen Labview Interface gechrieben.<br />
Die Interface an sich funktioniert einwandfrei, nun gefehlt es mir nicht wie die C-Wrapper implementiert ist.</p>
<p>Bei jede exportierte Funktion wird eine try und catch eigesetzt, was nicht unbedingt der Sinn der OOP ist.<br />
Einen Beispiel:</p>
<pre><code>/* Headder*/
// MeasureStart ist die gewrapperte Class
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref);
</code></pre>
<pre><code>/*cpp*/
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref)
{
	int Error = 0;
	try
	{
		LV_ref-&gt;MeasureCont();
	}
	catch(QString &amp;msg)
	{
		// hier wird eine Nummer zu den Fehler gegeben 
		// z.B
		Error = 5006;
	}
	return Error;
}
....
</code></pre>
<p>// und diese try und catch wiederholt sich bei alle exportierte Funktionen</p>
<p>Meine Frage wie kann ich das besser machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490459</guid><dc:creator><![CDATA[Gerhard_gast]]></dc:creator><pubDate>Wed, 16 Mar 2016 07:07:46 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 07:31:28 GMT]]></title><description><![CDATA[<p>try-catch-Blöcke mit OOP in Zusammenhang bringen ist nun ja... nicht sehr glücklich.</p>
<p>try-catch-Blöcke dienen dazu, erwartete Ausnahmen zu behandeln. Im Fall von deinem Wrapper ist es nun eben so, dass ein Fehlercode festgelegt wird um außerhalb der Wrapper-Funktion zu erkennen, dass etwas schief gelaufen ist.</p>
<p>Wo du die Ausnahme abfängst ist mMn. dir überlassen, aber abfangen musst du sie. - Ich finde in deinem Beispiel direkt beim Zugriff gar nicht so verkehrt gewählt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490463</guid><dc:creator><![CDATA[inflames2k]]></dc:creator><pubDate>Wed, 16 Mar 2016 07:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 07:40:25 GMT]]></title><description><![CDATA[<p>nunja, wenn die C interfaces error codes zurück liefern sollen wird man wohl um solche Konstrukte nur schwer herum kommen.</p>
<p>Macros ?</p>
<pre><code>ERRNUM_CHECKED(LV_ref-&gt;MeasureCont(); 5006) ;
</code></pre>
<p>auch nicht schön, aber kürzer</p>
<p>wobei ERRNUM_CHECKED auch eine Funktion sein könnte die eine Funktion und einen Fehler Code nimmt.</p>
<p>dummycode</p>
<pre><code>template &lt;tyename T&gt; // T ist ein callable
int  err_checked( T f, int errcode)
{
    try
    {
        f();
    }
    catch(...)
    {
       return errcode ;
    }
    return 0 ;
}

....

void somewhere() {
  // undgefähr so
 err_checked( std::bind(LV_ref, LV_Klass::MeasureCont), 5006) ;
}
</code></pre>
<p>das Problem ist freilich das catch(...)<br />
sollte die geworfene Information nicht immer vom gleichen Type sein und du damit etwas machen wollen, das Problem gilt also auch für die Makro Variante.</p>
<p>Oder, einfach ein IDE verwenden die den try catch Block für dich schreibt, zumindest das grundgerüsst, geht eigentlich mit allen IDEs / Editoren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490465</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Wed, 16 Mar 2016 07:40:25 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 08:19:22 GMT]]></title><description><![CDATA[<p>Ich habe meinen cpp Code um einen class ErrorHandlingWrapper erweitert, die sieht so aus:</p>
<pre><code>/*Header class ErrorHandlingWrapper */
typdef enum ErrorList{
	DiodeVoltageError = 5000,
	LEDCurrentError,
	.....

}t_ErrorList;

class ErrorHandlingWrapper
{

public:
	ErrorHandlingWrapper(void);
	~ErrorHandlingWrapper(void);

	int IsThisError(QString &amp;msg);

};
</code></pre>
<pre><code>/*cpp Teil*/
ErrorHandlingWrapper::ErrorHandlingWrapper(void)
{
}

ErrorHandlingWrapper::~ErrorHandlingWrapper(void)
{ 
}

int ErrorHandlingWrapper::IsThisError(QString &amp;msg)
{
	t_ErrorList Error = static_cast&lt;t_ErrorList&gt;(0);

	if (!msg.compare(QString(&quot;ErrorVoltage/Parameter Error&quot;)))
		Error = DiodeVoltageError;
		........
	// hier werden alle mögliche Error in dieses DLL abgefangen
	// es ist nicht schön gelöst aber auf einen Feadback wird mich freuen
	....
}
</code></pre>
<p>und dann die nötigen Erweiterungen:</p>
<pre><code>/*cpp*/
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref)
{
	int Error = 0;
	ErrorHandlingWrapper* errorHandlingWrapper = NULL;
	try
	{
		LV_ref-&gt;MeasureCont();
	}
	catch(QString &amp;msg)
	{
		if(errorHandlingWrapper-&gt;IsThisError(msg))
		{
			Error = errorHandlingWrapper-&gt;IsThisError(msg); 
		}
		else
		{
			Error = UnknownErrorConst;		
		}

	}
	DeleteAndNull(errorHandlingWrapper); 
	return Error;
}

// Aufräumen Arbeit
template&lt;typename T&gt;
void DeleteAndNull(T*&amp; pointer)
{
	if(pointer != NULL)
	{
		delete pointer;
		pointer = 0;
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2490471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490471</guid><dc:creator><![CDATA[MarcoGast]]></dc:creator><pubDate>Wed, 16 Mar 2016 08:19:22 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 08:34:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<pre><code>if(errorHandlingWrapper-&gt;IsThisError(msg))
{
    Error = errorHandlingWrapper-&gt;IsThisError(msg);
}
</code></pre>
<p>Denkst du echt, dass es Sinn macht die Methode 2 mal aufzurufen? Cooler wäre doch, wenn IsThisError bereits UnknownErrorConst zurück liefern würde spart doch auch Code?</p>
<pre><code>extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref)
{
    int Error = 0;
    ErrorHandlingWrapper* errorHandlingWrapper = NULL;
    try
    {
        LV_ref-&gt;MeasureCont();
    }
    catch(QString &amp;msg)
    {
        Error = errorHandlingWrapper-&gt;IsThisError(msg);  
    }
    DeleteAndNull(errorHandlingWrapper);
    return Error;
}
</code></pre>
<pre><code>int ErrorHandlingWrapper::IsThisError(QString &amp;msg)
{
    t_ErrorList Error = static_cast&lt;t_ErrorList&gt;(0);
    // Greift keine der unteren if's, wird UnknownErrorConst zurück
    // geliefert.
    Error = UnknownErrorConst;

    if (!msg.compare(QString(&quot;ErrorVoltage/Parameter Error&quot;)))
        Error = DiodeVoltageError;
        ........
    // hier werden alle mögliche Error in dieses DLL abgefangen
    // es ist nicht schön gelöst aber auf einen Feadback wird mich freuen
    ....
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2490478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490478</guid><dc:creator><![CDATA[inflames2k]]></dc:creator><pubDate>Wed, 16 Mar 2016 08:34:51 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 08:44:44 GMT]]></title><description><![CDATA[<p>inflames2k schrieb:</p>
<blockquote>
<p>Denkst du echt, dass es Sinn macht die Methode 2 mal aufzurufen?</p>
</blockquote>
<p>Welche Methode 2 meinst du bitte?</p>
<p>inflames2k schrieb:</p>
<blockquote>
<p>Cooler wäre doch, wenn IsThisError bereits UnknownErrorConst zurück liefern würde spart doch auch Code?</p>
</blockquote>
<p>Du hast vollkommen recht. Da spart man viel Code danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2490483</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490483</guid><dc:creator><![CDATA[Gerhard_gast]]></dc:creator><pubDate>Wed, 16 Mar 2016 08:44:44 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 08:49:22 GMT]]></title><description><![CDATA[<p>Siehe z.B. hier:<br />
<a href="https://blogs.msdn.microsoft.com/vcblog/2014/01/16/exception-boundaries/" rel="nofollow">https://blogs.msdn.microsoft.com/vcblog/2014/01/16/exception-boundaries/</a></p>
<pre><code class="language-cpp">template&lt;typename F&gt;
int wrapper(F&amp;&amp; f)
	try
		{
			f();
			return 0;
		}
	catch(const QString&amp; s)
		{
			if(s == &quot;ErrorVoltage/Parameter Error&quot;)
				return DiodeVoltageError;
			else if (s == ...)
				return ...;
			...
		}
	catch(...)
		{
			return ...; 
		}

/*cpp*/
extern &quot;C&quot;__declspec (dllexport) int measureWrapper(MeasureStart *LV_ref)
{
	return wrapper([&amp;]{
			measureWrapper(LV_ref-&gt;MeasureCont());
		});
}
</code></pre>
<p><code>wrapper</code> könnte auch ein Funktionsobjekt sein - vielleicht mit einer <code>static std::map&lt;QString, ErrorCode&gt;</code> als member?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490484</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Wed, 16 Mar 2016 08:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 09:02:07 GMT]]></title><description><![CDATA[<p>Gerhard_gast schrieb:</p>
<blockquote>
<p>inflames2k schrieb:</p>
<blockquote>
<p>Denkst du echt, dass es Sinn macht die Methode 2 mal aufzurufen?</p>
</blockquote>
<p>Welche Methode 2 meinst du bitte?</p>
</blockquote>
<p>Ich meine keine <strong>Methode 2</strong> sondern das 2 malige Aufrufen von IsThisError ;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490492</guid><dc:creator><![CDATA[inflames2k]]></dc:creator><pubDate>Wed, 16 Mar 2016 09:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 09:17:42 GMT]]></title><description><![CDATA[<p>inflames2k schrieb:</p>
<blockquote>
<p>Ich meine keine <strong>Methode 2</strong> sondern das 2 malige Aufrufen von IsThisError ;).</p>
</blockquote>
<p>immer nit kapiert Sorry</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490495</guid><dc:creator><![CDATA[Gerhard_gast]]></dc:creator><pubDate>Wed, 16 Mar 2016 09:17:42 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 10:40:07 GMT]]></title><description><![CDATA[<p>Warum wirft LV_ref-&gt;MeasureCont() einen QString als Exception? Hier fängt das Problem an! Eine Exception sollte <strong>immer</strong> von std::exception abgeleitet sein. Und sie könnte natürlich gleich eine Fehlernummer mitliefern.</p>
<p>DeleteAndNull? Das ist einfach nur Müll. Benutze std::unique_ptr. Das alles hilft aber nichts, wenn man dann den NULL-Pointer errorHandlingWrapper deferenziert (so wie in deinem Code).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490515</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490515</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 16 Mar 2016 10:40:07 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 12:01:10 GMT]]></title><description><![CDATA[<p>manni66 schrieb:</p>
<blockquote>
<p>Warum wirft LV_ref-&gt;MeasureCont() einen QString als Exception?</p>
</blockquote>
<p>Ich habe dieses Projekt geerbt von daher muss ich damit leben</p>
<p>manni66 schrieb:</p>
<blockquote>
<p>Hier fängt das Problem an! Eine Exception sollte <strong>immer</strong> von std::exception abgeleitet sein. Und sie könnte natürlich gleich eine Fehlernummer mitliefern.</p>
</blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>DeleteAndNull? Das ist einfach nur Müll. Benutze std::unique_ptr. Das alles hilft aber nichts, wenn man dann den NULL-Pointer errorHandlingWrapper deferenziert (so wie in deinem Code).</p>
</blockquote>
<p>Ich benutze Visual Studio 2008 und</p>
<pre><code>std::unique_ptr
</code></pre>
<p>ist leider nicht definiet also ich habe deann zwei Möglichekeiten entwieder einen Macro oder so was in der Art zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490537</guid><dc:creator><![CDATA[Gerhard_gast]]></dc:creator><pubDate>Wed, 16 Mar 2016 12:01:10 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Wed, 16 Mar 2016 12:14:36 GMT]]></title><description><![CDATA[<p>Gerhard_gast schrieb:</p>
<blockquote>
<p>manni66 schrieb:</p>
<blockquote>
<p>Warum wirft LV_ref-&gt;MeasureCont() einen QString als Exception?</p>
</blockquote>
<p>Ich habe dieses Projekt geerbt von daher muss ich damit leben</p>
</blockquote>
<p>Nein, musst du nicht! Statt mit viel Aufwand Strings auf Nummern zu mappen könntest du es einfach richtig machen</p>
<p>Gerhard_gast schrieb:</p>
<blockquote>
<p>Ich benutze Visual Studio 2008 und</p>
<pre><code>std::unique_ptr
</code></pre>
<p>ist leider nicht definiet also ich habe deann zwei Möglichekeiten entwieder einen Macro oder so was in der Art zu implementieren?</p>
</blockquote>
<ol>
<li>du kannst boost::scoped_ptr oder std::auto_ptr benutzen</li>
<li>ich sehe keinen Grund, warum du an der Stelle überhaupt new/delete benutzt, statt das Objekt auf dem Stack anzulegen. Wobei, new benutzt du ja nicht. Du dereferenzierst einen NULL-Pointer.</li>
<li>deinem Code kann ich keinen Grund entnehmen, warum das Ganze überhaupt in einem Objekt verpackt ist. Eine einfach Funktion würde es auch tun</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/2490540</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490540</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 16 Mar 2016 12:14:36 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Thu, 17 Mar 2016 07:41:46 GMT]]></title><description><![CDATA[<p>@manni66<br />
Ich habe deinen Rat gefolgt.</p>
<p>Wie soll ich die Fehlerbehandlung am geschicktesten designen?</p>
<p>Fehlerbehandlung heisst:</p>
<ol>
<li>Fehlererkennung<br />
und<br />
2)Fehlerbehandlung<br />
--&gt; Müssen beide von einander getrennt werden (jeweils eine class)?</li>
</ol>
<p>Soll die Fehlerbehandlung zentral sein (einen übergreifende class)?</p>
<p>--&gt; In meine Appllikation (geerbt von ex Kolleger) sind über 20 class.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490667</guid><dc:creator><![CDATA[Gerhard_gast]]></dc:creator><pubDate>Thu, 17 Mar 2016 07:41:46 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Thu, 17 Mar 2016 09:23:41 GMT]]></title><description><![CDATA[<p>Gerhard_gast schrieb:</p>
<blockquote>
<p>Meine Frage wie kann ich das besser machen?</p>
</blockquote>
<p>* Dokumentierten Aufzählungstypen statt &quot;magic number&quot; verwenden.<br />
* Exceptiontypen als _const_ Referenz fangen.<br />
* sich wiederholenden Code in eine Funktion auslagern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490679</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490679</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Thu, 17 Mar 2016 09:23:41 GMT</pubDate></item><item><title><![CDATA[Reply to try und catch sinnvoll einsetzen on Thu, 17 Mar 2016 11:06:18 GMT]]></title><description><![CDATA[<p>(Anmerkung: Irgendwie scheinst du auf Klassen fixiert zu sein. In C++ muss nicht alles eine Klasse sein.)</p>
<p>Wie das konkret in deinem Fall aussehen muss, kann man hier sicher nicht klären. Das hängt auch davon ab, wozu der Code eigentlich benutzt wird. Wenn er nur dazu dient, per C-Wrapper eine Funktionalität in Labview zur Verfügung zu stellen (und man im Fehlerfall dort nur einen Fehlercode liefern kann), wäre eine Exception, die nur den Fehlercode liefert, völlig ausreichend. Dort, wo jetzt QString geworfen wird, muss dann halt eine Exception mit dem Fehlercode geworfen werden. In der C-Wrapperfunktion kannst du die Exception fangen und den Code zurückgeben. Das bisschen try/catch/return kann man dann auch einfach duplizieren.</p>
<p>Als Skizze:</p>
<pre><code class="language-cpp">#include &lt;exception&gt;
#include &lt;iostream&gt;

enum Errocode
  { NoPermission = 5000,
    NotOpen
  };

struct Ex : std::exception
{
  Errocode errorcode;
  Ex( Errocode errorcode ) noexcept : errorcode(errorcode){}
};

struct ExNotOpen : Ex
{
  ExNotOpen() noexcept : Ex(NotOpen) {}
};

void f()
{
  throw ExNotOpen{}; // oder Ex(NotOpen)
}

int g()
{
  try{
    f();
  }
  catch( const Ex&amp; e ) {
    return e.errorcode;
  }
  return 0;
}

int main()
{
  int erg = g();

  std::cout &lt;&lt; erg &lt;&lt; &quot;\n&quot;;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2490692</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490692</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Thu, 17 Mar 2016 11:06:18 GMT</pubDate></item></channel></rss>