CException
-Klasse
Die Basisklasse für alle Ausnahmen in der Microsoft Foundation Class-Bibliothek.
Syntax
class AFX_NOVTABLE CException : public CObject
Member
Öffentliche Konstruktoren
Name | Beschreibung |
---|---|
CException::CException |
Erstellt ein CException -Objekt. |
Öffentliche Methoden
Name | Beschreibung |
---|---|
CException::Delete |
Löscht ein CException Objekt. |
CException::ReportError |
Meldet eine Fehlermeldung in einem Meldungsfeld an den Benutzer. |
Hinweise
Da CException
es sich um eine abstrakte Basisklasse handelt, können Sie keine Objekte direkt erstellen CException
. Sie müssen Objekte abgeleiteter Klassen erstellen. Wenn Sie Eine eigene CException
-Style-Klasse erstellen müssen, verwenden Sie eine der oben aufgeführten abgeleiteten Klassen als Modell. Stellen Sie sicher, dass ihre abgeleitete Klasse auch verwendet IMPLEMENT_DYNAMIC
wird.
Die abgeleiteten Klassen und ihre Beschreibungen sind unten aufgeführt:
Name | Beschreibung |
---|---|
CSimpleException |
Eine Basisklasse für ressourcenkritische MFC-Ausnahmen |
CInvalidArgException |
Ungültige Ausnahmebedingung für Argumente |
CMemoryException |
Ausnahme außerhalb des Arbeitsspeichers |
CNotSupportedException |
Anforderung für einen nicht unterstützten Vorgang |
CArchiveException |
Archivspezifische Ausnahme |
CFileException |
Dateispezifische Ausnahme |
CResourceException |
Windows-Ressource nicht gefunden oder nicht creatierbar |
COleException |
OLE-Ausnahme |
CDBException |
Datenbankausnahme (d. h. Ausnahmebedingungen für MFC-Datenbankklassen basierend auf Open Database Connectivity) |
COleDispatchException |
OLE-Verteiler (Automatisierungs)-Ausnahme |
CUserException |
Ausnahme, die angibt, dass eine Ressource nicht gefunden werden konnte |
CDaoException |
Ausnahme des Datenzugriffsobjekts (d. a. Ausnahmebedingungen für DAO-Klassen) |
CInternetException |
Internetausnahme (d. a. Ausnahmebedingungen für Internetklassen). |
Diese Ausnahmen sind für die Verwendung mit den Makros , THROW_LAST
, , try
, catch
and_catch
uswend_catch
. vorgesehen.THROW
Weitere Informationen zu Ausnahmen finden Sie unter "Exception Processing" oder im Artikel " Exception Handling (MFC)".
Verwenden Sie die entsprechende abgeleitete Klasse, um eine bestimmte Ausnahme abzufangen. Um alle Arten von Ausnahmen abzufangen, verwenden Sie CException
diese, und verwenden Sie CObject::IsKindOf
dann, um zwischen CException
abgeleiteten Klassen zu unterscheiden. Beachten Sie, dass CObject::IsKindOf
nur für Klassen funktioniert, die mit dem IMPLEMENT_DYNAMIC
Makro deklariert sind, um die dynamische Typüberprüfung zu nutzen. Jede CException
abgeleitete Klasse, die Sie erstellen, sollte auch das IMPLEMENT_DYNAMIC
Makro verwenden.
Sie können Details zu Ausnahmen für den Benutzer melden, indem Sie zwei Memberfunktionen aufrufen GetErrorMessage
, ReportError
die mit einer der CException
abgeleiteten Klassen funktionieren.
Wenn eine Ausnahme von einem der Makros abgefangen wird, wird das CException
Objekt automatisch gelöscht. Löschen Sie sie nicht selbst. Wenn eine Ausnahme mithilfe eines catch
Schlüsselworts abgefangen wird, wird sie nicht automatisch gelöscht. Weitere Informationen zum Löschen eines Ausnahmeobjekts finden Sie im Artikel "Exception Handling(MFC )".
Vererbungshierarchie
CException
Anforderungen
Header: afx.h
CException::CException
Diese Memberfunktion erstellt ein CException
Objekt.
explicit CException(BOOL bAutoDelete);
Parameter
b_AutoDelete
Geben Sie an TRUE
, ob der Speicher für das CException
Objekt für den Heap zugewiesen wurde. Dadurch wird das CException
Objekt gelöscht, wenn die Delete
Memberfunktion aufgerufen wird, um die Ausnahme zu löschen. Geben Sie an FALSE
, ob sich das CException
Objekt im Stapel befindet oder ein globales Objekt ist. In diesem Fall wird das CException
Objekt nicht gelöscht, wenn die Delete
Memberfunktion aufgerufen wird.
Hinweise
Normalerweise müssen Sie diesen Konstruktor niemals direkt aufrufen. Eine Funktion, die eine Ausnahme auslöst, sollte eine Instanz einer CException
abgeleiteten Klasse erstellen und den Konstruktor aufrufen oder eine der MFC-Auslösenfunktionen verwenden, z AfxThrowFileException
. B. zum Auslösen eines vordefinierten Typs. Diese Dokumentation wird nur zur Vollständigkeit bereitgestellt.
CException::Delete
Mit dieser Funktion wird überprüft, ob das CException
Objekt im Heap erstellt wurde, und in diesem Fall ruft sie den delete
Operator für das Objekt auf.
void Delete();
Hinweise
Verwenden Sie beim Löschen eines CException
Objekts die Delete
Memberfunktion, um die Ausnahme zu löschen. Verwenden Sie den delete
Operator nicht direkt, da das CException
Objekt möglicherweise ein globales Objekt ist oder im Stapel erstellt wurde.
Sie können angeben, ob das Objekt beim Erstellen des Objekts gelöscht werden soll. Weitere Informationen finden Sie unter CException::CException
.
Sie müssen nur aufrufen Delete
, wenn Sie den C++ try
- catch
-Mechanismus verwenden. Wenn Sie die MFC-Makros TRY
verwenden und CATCH
diese Makros diese Funktion automatisch aufrufen.
Beispiel
CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
// Note that this example performs the same actions as the
// example for CATCH, but uses C++ try/catch syntax instead
// of using the MFC TRY/CATCH macros. This sample must use
// CException::Delete() to delete the exception objects
// before closing the catch block, while the CATCH example
// implicitly performs the deletion via the macros.
try
{
pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG ullLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %u bytes long."), ullLength);
AfxMessageBox(str);
}
catch(CFileException* pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
pEx->Delete();
}
catch(CMemoryException* pEx)
{
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally, an
// an application should do everything it possibly can to
// clean up properly and _not_ call AfxAbort().
pEx->Delete();
AfxAbort();
}
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
CException::ReportError
Rufen Sie diese Memberfunktion auf, um Fehlertext in einem Meldungsfeld an den Benutzer zu melden.
virtual int ReportError(
UINT nType = MB_OK,
UINT nMessageID = 0);
Parameter
nType
Gibt die Formatvorlage des Meldungsfelds an. Wenden Sie eine beliebige Kombination der Nachrichtenfeldformatvorlagen auf das Feld an. Wenn Sie diesen Parameter nicht angeben, lautet MB_OK
der Standardwert .
nMessageID
Gibt die Ressourcen-ID (Zeichenfolgentabelleneintrag) einer Meldung an, die angezeigt werden soll, wenn das Ausnahmeobjekt keine Fehlermeldung enthält. Wenn 0, wird die Meldung "Keine Fehlermeldung verfügbar" angezeigt.
Rückgabewert
Ein AfxMessageBox
Wert; andernfalls 0, wenn nicht genügend Arbeitsspeicher zum Anzeigen des Meldungsfelds vorhanden ist. Informationen zu den möglichen Rückgabewerten finden Sie AfxMessageBox
unter.
Beispiel
Hier ist ein Beispiel für die Verwendung von CException::ReportError
. Ein weiteres Beispiel finden Sie im Beispiel für CATCH
.
CFile fileInput;
CFileException ex;
// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.
// if the call to Open() fails, ex will be
// initialized with exception
// information. the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path." The error message text will be
// appropriate for the
// file name and error condition.
if (!fileInput.Open(_T("\\Too\\Many\\Bad\\Dirs.DAT"), CFile::modeRead, &ex))
{
ex.ReportError();
}
else
{
// the file was opened, so do whatever work
// with fileInput we were planning...
fileInput.Close();
}