Teilen über


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_DYNAMICwird.

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, catchand_catchuswend_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 CExceptiondiese, und verwenden Sie CObject::IsKindOf dann, um zwischen CExceptionabgeleiteten 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 CExceptionabgeleitete 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 , ReportErrordie mit einer der CExceptionabgeleiteten 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

CObject

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 CExceptionabgeleiteten 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 CATCHdiese 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_OKder 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();
}

Siehe auch

CObject-Klasse
Hierarchiediagramm
Ausnahmeverarbeitung