<?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[Exception Handling - Microsoft spezifisch]]></title><description><![CDATA[<p>hallo,</p>
<p>erstmal Beispiel Quellcode:</p>
<pre><code class="language-cpp">int	main(int argc, char* argv[], char* envp[]);
void	Recursion4Ever();
void	SE_Translator(UINT nErrCode, _EXCEPTION_POINTERS* e);

class CStackOverFlowException 
{};
class CAccessViolationException
{};

void	SE_Translator(UINT nErrCode, _EXCEPTION_POINTERS* /*e*/)
{
	switch (nErrCode) {
		case	EXCEPTION_STACK_OVERFLOW:
			throw	new CStackOverFlowException;
		case	EXCEPTION_ACCESS_VIOLATION:
			throw	new CAccessViolationException;
		default:
			exit(nErrCode);
	}
}

void	Recursion4Ever()
{
	free(malloc(0));
	asm	sub	 esp, 0x10		//	bisschen beschleunigen den Vorgang
	asm	call	Recursion4Ever
}

int main(int argc, char* argv[], char* envp[])
{
	_set_se_translator(SE_Translator);

	try {
		Recursion4Ever();
	} catch (CStackOverFlowException* e) {
		cout &lt;&lt; &quot;Stack Overflow!\n&quot;;
		delete	e;
	} catch (CAccessViolationException* e) {
		cout &lt;&lt; &quot;Access Violation!\n&quot;;
		delete	e;
	}

	system(&quot;pause&quot;);

	return 0;
}
</code></pre>
<p>folgendes Problem besteht nun:</p>
<p>falls die Stack Overflow Exception irgendwo bei durch malloc oder free ausgelöst wird, wird die SE_Translator Funktion nicht aufgerufen, so das ich auch keine Fehler catchen kann <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="😞"
    /><br />
Das liegt evtl. daran (ich bin mir nicht ganz sicher), dass DLL's ihre eigene Translator-Funktion haben, ich müsste also für die DLL bzw. alle DLL's irgendwie die Translator Function setzten.<br />
(jedenfalls hat jeder Thread seine eigene.)</p>
<p>Wäre echt nett, falls mir da jemand helfen kann <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>MfG<br />
DDR-RAM</p>
<p>P.S.:<br />
Nicht von den beiden Assembleranweisungen beunruhigen lassen, die ham nur den vorteil, das MS VC++ da nicht mit rumdoktort.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/100103/exception-handling-microsoft-spezifisch</link><generator>RSS for Node</generator><lastBuildDate>Tue, 28 Apr 2026 16:28:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/100103.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 03 Feb 2005 18:20:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Thu, 03 Feb 2005 18:31:38 GMT]]></title><description><![CDATA[<p>hallo,</p>
<p>erstmal Beispiel Quellcode:</p>
<pre><code class="language-cpp">int	main(int argc, char* argv[], char* envp[]);
void	Recursion4Ever();
void	SE_Translator(UINT nErrCode, _EXCEPTION_POINTERS* e);

class CStackOverFlowException 
{};
class CAccessViolationException
{};

void	SE_Translator(UINT nErrCode, _EXCEPTION_POINTERS* /*e*/)
{
	switch (nErrCode) {
		case	EXCEPTION_STACK_OVERFLOW:
			throw	new CStackOverFlowException;
		case	EXCEPTION_ACCESS_VIOLATION:
			throw	new CAccessViolationException;
		default:
			exit(nErrCode);
	}
}

void	Recursion4Ever()
{
	free(malloc(0));
	asm	sub	 esp, 0x10		//	bisschen beschleunigen den Vorgang
	asm	call	Recursion4Ever
}

int main(int argc, char* argv[], char* envp[])
{
	_set_se_translator(SE_Translator);

	try {
		Recursion4Ever();
	} catch (CStackOverFlowException* e) {
		cout &lt;&lt; &quot;Stack Overflow!\n&quot;;
		delete	e;
	} catch (CAccessViolationException* e) {
		cout &lt;&lt; &quot;Access Violation!\n&quot;;
		delete	e;
	}

	system(&quot;pause&quot;);

	return 0;
}
</code></pre>
<p>folgendes Problem besteht nun:</p>
<p>falls die Stack Overflow Exception irgendwo bei durch malloc oder free ausgelöst wird, wird die SE_Translator Funktion nicht aufgerufen, so das ich auch keine Fehler catchen kann <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="😞"
    /><br />
Das liegt evtl. daran (ich bin mir nicht ganz sicher), dass DLL's ihre eigene Translator-Funktion haben, ich müsste also für die DLL bzw. alle DLL's irgendwie die Translator Function setzten.<br />
(jedenfalls hat jeder Thread seine eigene.)</p>
<p>Wäre echt nett, falls mir da jemand helfen kann <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>MfG<br />
DDR-RAM</p>
<p>P.S.:<br />
Nicht von den beiden Assembleranweisungen beunruhigen lassen, die ham nur den vorteil, das MS VC++ da nicht mit rumdoktort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/713960</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/713960</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Thu, 03 Feb 2005 18:31:38 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Fri, 04 Feb 2005 08:25:32 GMT]]></title><description><![CDATA[<p>kann auch nur raten. <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 />
1. sollten exceptions nicht bei value geworfen werden? zumindest ist dieses bei c++ exceptions so.<br />
2. compiler flag beachtet</p>
<p>msdn schrieb:</p>
<blockquote>
<p>Use /EHa instead of /EHsc when using _set_se_translator.</p>
</blockquote>
<p>3. hat nichts mit deinem fehler zu tun. _set_se_translator würde ich der sauberkeit halber auch in den try block schreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714277</guid><dc:creator><![CDATA[miller_m]]></dc:creator><pubDate>Fri, 04 Feb 2005 08:25:32 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Fri, 04 Feb 2005 17:01:24 GMT]]></title><description><![CDATA[<p>miller_m schrieb:</p>
<blockquote>
<p>kann auch nur raten. <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 />
1. sollten exceptions nicht bei value geworfen werden? zumindest ist dieses bei c++ exceptions so.<br />
2. compiler flag beachtet</p>
<p>msdn schrieb:</p>
<blockquote>
<p>Use /EHa instead of /EHsc when using _set_se_translator.</p>
</blockquote>
<p>3. hat nichts mit deinem fehler zu tun. _set_se_translator würde ich der sauberkeit halber auch in den try block schreiben.</p>
</blockquote>
<p>hi, erstmal generell danke <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>aber,<br />
zu 1. das man pointer wirft ist vollkommen legitim und standardkonform (soweit ich weiß)<br />
zu 2. hab ich, sonst kann kommt sogar ein Compilerfehler<br />
zu 3. ist mir nicht bekannt, das _set_se_translator was wirft, aber schaden kanns nicht, werd da maln nen bisschen was testen,</p>
<p>alles in allem bin ich also noch nicht soo <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="😃"
    /> viel weiter.<br />
kann allerdings selber eine Idee einbringen <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 />
ich könnte vor allen malloc aufrufen überprüfen ob noch genügend stack vorhanden ist, naja wäre halt ein wenig umständlich <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>hier mal der erweiterte Code (damit funktioniert dann auch alles richtig)</p>
<pre><code class="language-cpp">void	CheckStack(int nStackSize)
{
	_alloca(nStackSize);
}

void	Recursion4Ever()
{
	CheckStack(0x1000);	//	eine page
	free(malloc(0));
	__asm	sub		esp, 0x10		//	bisschen beschleunigen den Vorgang
	__asm	call	Recursion4Ever
}
</code></pre>
<p>Aber vielleicht gibt es da auch ne Möglichkeit die so ähnlich ist.<br />
wäre echt cool, wenn jemand da helfen könnte,<br />
aber solange muss ich es auf wohl noch auf meine TODO-List setzten</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/714729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/714729</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Fri, 04 Feb 2005 17:01:24 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 06:14:52 GMT]]></title><description><![CDATA[<p>Normalerweise kann man SEH und C++ Exceptions nicht mischen.</p>
<p>Ich wuerde zuerst einen SEH-Handler schreiben, also mit &quot;_try .. _catch ( )&quot;, wobei in der _catch-Zeile der SEH-Handler aufgerufen wird. Die Funktion, die den SEH-Handler enthaelt, gibt z.B. bloss einen Returncode zurueck. Die aufrufende Funktion wirft dann eine C++ Exception. Damit haettest Du die beiden Exception-Systeme getrennt.</p>
<p>Bei DLLs ist es ratsam, sowohl einen SEH Handler, als auch einen C++ Handler zu haben, damit ein DLL API niemals eine Exception werfen kann. Ausserdem sollte man die Exception-Semantik auf auesserster DLL-Ebene durch das Kapseln des DLL-Interfaces mittels &quot; extern &quot;C&quot; { ... } &quot; entfernen. Dadurch wird die DLL unabhaengig vom verwendeten Compiler, da auch kein Name-Mangling mehr stattfindet. Auf der aufrufenden Seite kann man dann das C-API der DLL wieder in Klassen kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/716359</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/716359</guid><dc:creator><![CDATA[Power Off]]></dc:creator><pubDate>Mon, 07 Feb 2005 06:14:52 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 15:16:27 GMT]]></title><description><![CDATA[<p>Die verschieden EH-Typen darf man mischen nur nicht in der selben Funktion.</p>
<p>Bin jetzt auf den Verursacher des ersten Teils meines Problems gestoßen und da kann man dann auch schnell was lösen, werd hier nochmal posten, falls es wen interessiert <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>Danke Power Off, du hast mir einen entscheidenden Denkanstoss gegeben, der wenig mit deinem gesagten zu tun hat <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>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/716841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/716841</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Mon, 07 Feb 2005 15:16:27 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 15:48:52 GMT]]></title><description><![CDATA[<p>Ja, mich interessiert's <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/716872</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/716872</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 07 Feb 2005 15:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 18:50:03 GMT]]></title><description><![CDATA[<p>Der Quelltext (aus meinem ersten Post):</p>
<pre><code class="language-cpp">void    Recursion4Ever()
{
    free(malloc(0));
    asm    sub     esp, 0x10        //    bisschen beschleunigen den Vorgang
    asm    call    Recursion4Ever
}
</code></pre>
<p>Das Problem:</p>
<p>malloc gibt bei Fehler NULL zurück, free kehrt bei übergebenen NULL-pointer sofort zurück. Da irgendwann, wenn der stack fast voll ist, malloc NULL zurückgibt und den Heap in einem beschädigten zustand zurücklassen wird,<br />
folgt beim nächsten Aufruf von malloc eine Access Violation.</p>
<p>Lösung:</p>
<p>Man muss ich den Rückgabewert von malloc (in diesem Fall) überprüfen.<br />
Und ggf. mit GetLastError checken, ob ein Stack Overflow aufgetreten ist<br />
(GetLastError() == ERROR_STACK_OVERFLOW)<br />
Eine weitere möglichkeit wäre einen newhandler zu etablieren.</p>
<p>wie gesagt, bei mir funct alles oder besser gesagt, ich weiß wieder wie ich alles zum funktionieren bringe.<br />
also wer noch Fragen hat, ich bin jetzt Meister <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="😃"
    /><br />
(waren aber auch Anfängerfehler :()</p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/717101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717101</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Mon, 07 Feb 2005 18:50:03 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 19:45:53 GMT]]></title><description><![CDATA[<p>Und dann? Dann ist der Heap kaputt, und man crasht erst recht ziemlich bald.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/717164</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717164</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 07 Feb 2005 19:45:53 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 20:08:06 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<p>Und dann? Dann ist der Heap kaputt, und man crasht erst recht ziemlich bald.</p>
</blockquote>
<p>Wie was?<br />
Wovon soll der Heap denn jetzt kaputt gehen?<br />
NewHandler doch nicht? und Rückgabewert überprüfen?</p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/717185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717185</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Mon, 07 Feb 2005 20:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 20:54:03 GMT]]></title><description><![CDATA[<blockquote>
<p>malloc NULL zurückgibt und den Heap in einem beschädigten zustand zurücklassen wird</p>
</blockquote>
<p>Du hast doch geschrieben, dass der Heap beschädigt zurückgelassen wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/717222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717222</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 07 Feb 2005 20:54:03 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 20:59:53 GMT]]></title><description><![CDATA[<p>Ringding schrieb:</p>
<blockquote>
<blockquote>
<p>malloc NULL zurückgibt und den Heap in einem beschädigten zustand zurücklassen wird</p>
</blockquote>
<p>Du hast doch geschrieben, dass der Heap beschädigt zurückgelassen wird.</p>
</blockquote>
<p>oh sry, my fault, ich meinte der stack wird in einem beschädigten Zustand zurückgelassen.<br />
Erklärung folgt sofort:</p>
<p>Dabei werden auch nicht irgendwelche Datenbeschädigt sondern nur die Guard Page, die normalerweise das Ende des Stacks markiert existiert nicht mehr, damit bekommt man beim nächsten Zugriff auf diese Speicherseite keinen Stack Overflow sondern ne Access Violation.<br />
Ich hoffe ich hab nicht für zu große Verwirrung gesorgt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /></p>
<p>MfG<br />
DDR-RAM</p>
]]></description><link>https://www.c-plusplus.net/forum/post/717230</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717230</guid><dc:creator><![CDATA[DDR-RAM]]></dc:creator><pubDate>Mon, 07 Feb 2005 20:59:53 GMT</pubDate></item><item><title><![CDATA[Reply to Exception Handling - Microsoft spezifisch on Mon, 07 Feb 2005 21:05:51 GMT]]></title><description><![CDATA[<p>Jetzt klingt's vernünftig <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/717244</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/717244</guid><dc:creator><![CDATA[Ringding]]></dc:creator><pubDate>Mon, 07 Feb 2005 21:05:51 GMT</pubDate></item></channel></rss>