MFC - TRY und CATCH
-
Hallo !
Ich hab bis heute das normale try und catch verfahren benutzt (c++) und wollte jetzt lernen wie es in MFC geht. Das Problem ist , dass ich keine anstädnige Beispiele finde.Hab mal dies versucht :
... var = 0; TRY { if (var == 0) { THROW 5; } } CATCH(int a) { MessageBoxW(L"Blub", L"blub", NULL); } END_CATCHDoch leider ohne Erfolg...
Habe dan im tiefen des Internetes diesen Mittel gefunden :... TRY { var_i = var_i + var_a; if (var_i == 0){AfxThrowUserException();} } CATCH(CException, e) { MessageBoxW(L"Fehler", L"Fehler", NULL); } END_CATCHWelches auch funktioniert.Doch warum wieso weshalb ? Ich weis es nicht.
Leider gab es auf der Seite keine Erklärung hierfür...Jetzt frage ich mich was dieses 'CException' ist , warum hierbei kein THROW mehr benutzt werden kann und was dieses AfxThrowUserException() ist und wann man es benutzt .
Leider habe ich keine deutsche Erklärung dafür gefunden und mein englisch ist auch nicht mehr das beste was es mal war , da ich auch nicht mehr so jung bin
Es würde mich freuen wenn jemand mir diese Sachen Aufklären könnte !
Mfg Grinch
-
**
TRY,CATCHundEND_CATCHsind Präprozessor-Macros, die von MFC definiert werden und die letztendlich auch bloß das normale C++try...catchverwenden.CException**ist die Basis-Klasse, von der alle MFC-spezifischen Exceptions abgeleitet sind.Der Unterschied ist, dass**
TRY...CATCH...END_CATCHausschließlich mit Exceptions funktioniert, die vom TypCException*sind bzw. die von diesem Typ abgeleitet wurden. Also mit Excpetions vom Typint**klappt es schon mal nicht, wie Du ja bereits gemerkt hast
Das normale**
try...catchFunktioniert hingegen mit beliebigen Exceptions. Der einzige "Vorteil" vonTRY...CATCHbesteht darin, dass dasCException-Objekt beim Verlassen desCATCH...END_CATCH**Blocks "automatisch" zerstört wird.Natürlich könntest Du Exceptions des Typs**
CException*auch mit dem ganz normalentry...catchanstattTRY...CATCHabfangen. Nur müsstest Du dann halt das Exception-Objekt explizit mittelsDelete()**zerstören - ansonsten handelst Du Dir ein Memory Leak ein!#define TRY { AFX_EXCEPTION_LINK _afxExceptionLink; try { #define CATCH(class, e) } catch (class* e) \ { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ _afxExceptionLink.m_pException = e; #define AND_CATCH(class, e) } catch (class* e) \ { ASSERT(e->IsKindOf(RUNTIME_CLASS(class))); \ _afxExceptionLink.m_pException = e; #define END_CATCH } }The major difference between the macros and the keywords is that code using the macros "automatically" deletes a caught exception when the exception goes out of scope. Code using the keywords does not, so you must explicitly delete a caught exception. The C++ exception-handling keywords are more versatile: They can handle exceptions of any data type that can be copied (int, float, char, and so on), whereas the macros handle exceptions only of class CException and classes derived from it.
Zusammengefasst:
Wenn Du es mit Exceptions des Typs**
CException*zu tun hast, kannst DuTRY...CATCH...END_CATCHbenutzen, auch wenn das kein Muss ist. In allen anderen Fällen musst Du ohnehin direkt mittry...catch**arbeiten.Siehe dazu auch die beiden Beispiele auf der offiziellen MSDN Seite, da ist eigentlich alles ausführlich erklärt:
http://msdn.microsoft.com/en-us/library/19z28s5c.aspx