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_CATCH
Doch 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_CATCH
Welches 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 binEs würde mich freuen wenn jemand mir diese Sachen Aufklären könnte !
Mfg Grinch
-
**
TRY
,CATCH
undEND_CATCH
sind Präprozessor-Macros, die von MFC definiert werden und die letztendlich auch bloß das normale C++try...catch
verwenden.CException
**ist die Basis-Klasse, von der alle MFC-spezifischen Exceptions abgeleitet sind.Der Unterschied ist, dass**
TRY...CATCH...END_CATCH
ausschließ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 hastDas normale**
try...catch
Funktioniert hingegen mit beliebigen Exceptions. Der einzige "Vorteil" vonTRY...CATCH
besteht 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...catch
anstattTRY...CATCH
abfangen. 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_CATCH
benutzen, 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