MFC try-catch Problem

Hallo,

ich habe ein Problem mit der Behandlung von Exceptions unter MFC (Visual Studio 6Sp5).

In einem try-Bereich wie unten angegeben, stehen Funktionsaufrufe, die die unterschiedlichsten Exception-Objekte schmeissen koennen. Neben den MFC Exceptions, existiert auch ein von mir gegebenes Exeption-Objekt mit Namen CBaseException, welches aber nicht von CException oder so abgeleitet ist.
Es ist ein struct, also alles public.

Das Exception-Handling will ich zentral verwalten, denn nach aussen soll nur ein HRESULT weitergegeben werden. Dazu fange ich die Objekte ueber catch(…) wie unten angeben erst mal allgemein ab und führe die individuelle Behandlung zentral in der Methode ProcessException() durch. Die Abarbeitung ist fast wie bei einem switch-case Konstrukt zu sehen und kann somit zentral schnell und einfach beliebig verfeinert werden.

// Begin
HRESULT hR = SUCCESS\_OK;

try {
 // Hier stehten Methodenaufrufe, die Exceptions schmeissen können.
}

catch (...) {
 hR = ProcessException();
}

return hR;
// End und Methode liefert hR zurueck

Es ergibt sich nun ein Problem bzgl. der Lebensdauer der Exception-Objekte.
Meine CBaseException fange ich als const reference ab. Dadurch vermeide ich als erstes den Copy-Constructor und zweitens kann im catch-Bereich keine Änderung am Objekt selbst vorgemommen werden.

Wenn der catch(const CBaseException& rEx) Bereich in ProcessException() verlassen wird, wird der Destructor von ~CBaseException aufgerufen. Soweit okay, aber vielleicht auch nicht ?!

HRESULT ProcessException(void)
{
 HRESULT hR = FAILED\_ABORT;

 try {
 throw;
 }

 catch (const CBaseException& rEx) {
 // Behandlung meines eigenen Exception-Objektes
 }

 catch (CMemoryException \*pEx) {
 pEx-\>ReportError();
 pEx-\>Delete();
 }

 catch(...) {
 // Allgemeine Behandlung einer unbekannten Exception
 }

 return(hR);

} // EOM:stuck\_out\_tongue:rocessException()

Nach dem Aufruf von ProcessException() wird aber in den obigen catch(…) Bereich:

catch (...) {
 hR = ProcessException();
}

zurueckgekehrt und ProcessException() liefert den HRESULT. Wird dieser catch-Bereich verlassen, wird nochmal der Destruktor von CBaseException aufgerufen !!!

Das dürfte nach C++ Standard nicht sein!!!

Kennt jemand ähnliche Effekte oder hat der Visual Studio Compiler einen schwerren Bug drin!!!
Dies ist insbesondere fuer mich wichtig, da eine Exception innerhalb einer Exception Abarbeitung das ganze System komplett zerschiesst!!!

Das Projekt ist uebrigens mit Warning Level 4 kompiliert!!!

Vielen Dank