Share via


CException-klasse

Opmerking

De Microsoft Foundation Classes-bibliotheek (MFC) wordt nog steeds ondersteund. We voegen echter geen functies meer toe of werken de documentatie bij.

De basisklasse voor alle uitzonderingen in de Microsoft Foundation Class Library.

Syntaxis

class AFX_NOVTABLE CException : public CObject

Leden

Openbare constructors

Naam Description
CException::CException Maakt een CException object.

Openbare methoden

Naam Description
CException::Delete Hiermee verwijdert u een CException object.
CException::ReportError Rapporteert een foutbericht in een berichtvak aan de gebruiker.

Opmerkingen

Omdat CException dit een abstracte basisklasse is, kunt u geen objecten rechtstreeks maken CException . U moet objecten van afgeleide klassen maken. Als u uw eigen CExceptionklasse -style wilt maken, gebruikt u een van de hierboven genoemde afgeleide klassen als model. Zorg ervoor dat uw afgeleide klasse ook wordt gebruikt IMPLEMENT_DYNAMIC.

De afgeleide klassen en hun beschrijvingen worden hieronder vermeld:

Naam Description
CSimpleException Een basisklasse voor resourcekritische MFC-uitzonderingen
CInvalidArgException Ongeldige uitzonderingsvoorwaarde voor argumenten
CMemoryException Uitzondering buiten het geheugen
CNotSupportedException Aanvraag voor een niet-ondersteunde bewerking
CArchiveException Archiefspecifieke uitzondering
CFileException Bestandsspecifieke uitzondering
CResourceException Windows-resource is niet gevonden of kan niet worden creatable
COleException OLE-uitzondering
CDBException Databaseuitzondering (uitzonderingsvoorwaarden die voortvloeien uit MFC-databaseklassen op basis van Open Database Connectivity)
COleDispatchException OLE-verzendings-uitzondering (automatisering)
CUserException Uitzondering die aangeeft dat een resource niet kan worden gevonden
CDaoException Uitzondering voor gegevenstoegangsobjecten (dat wil gezegd, uitzonderingsvoorwaarden die voortvloeien uit DAO-klassen)
CInternetException Internetuitzondering (dat wil gezegd, uitzonderingsvoorwaarden die voortvloeien uit internetklassen).

Deze uitzonderingen zijn bedoeld voor gebruik met de THROWmacro's , , THROW_LASTen and_catchtrycatchend_catch macro's. Zie Uitzonderingsverwerking of zie het artikel Exception Handling (MFC) voor meer informatie over uitzonderingen.

Als u een specifieke uitzondering wilt ondervangen, gebruikt u de juiste afgeleide klasse. Als u alle soorten uitzonderingen wilt ondervangen, gebruikt CExceptionu en gebruikt u CObject::IsKindOf deze om onderscheid te maken tussen CException-afgeleide klassen. Houd er rekening mee dat CObject::IsKindOf alleen werkt voor klassen die zijn gedeclareerd met de IMPLEMENT_DYNAMIC macro, om te profiteren van dynamische typecontrole. Elke CExceptionafgeleide klasse die u maakt, moet ook de IMPLEMENT_DYNAMIC macro gebruiken.

U kunt details over uitzonderingen voor de gebruiker rapporteren door twee lidfuncties aan te roepen GetErrorMessage die ReportErrormet een van CExceptionde afgeleide klassen werken.

Als een uitzondering wordt opgevangen door een van de macro's, wordt het CException object automatisch verwijderd. Verwijder het niet zelf. Als een uitzondering wordt afgevangen met behulp van een catch trefwoord, wordt deze niet automatisch verwijderd. Zie het artikel Exception Handling (MFC) voor meer informatie over het verwijderen van een uitzonderingsobject.

Overnamehiƫrarchie

CObject

CException

Requirements

Rubriek:afx.h

CException::CException

Met deze lidfunctie wordt een CException object samengesteld.

explicit CException(BOOL bAutoDelete);

Parameterwaarden

b_AutoDelete
Geef op TRUE of het geheugen voor het CException object is toegewezen aan de heap. Hierdoor wordt het CException object verwijderd wanneer de Delete lidfunctie wordt aangeroepen om de uitzondering te verwijderen. Geef op FALSE of het CException object zich op de stapel bevindt of een globaal object is. In dit geval wordt het CException object niet verwijderd wanneer de Delete lidfunctie wordt aangeroepen.

Opmerkingen

Normaal gesproken hoeft u deze constructor nooit rechtstreeks aan te roepen. Een functie die een uitzondering genereert, moet een exemplaar van een CException-afgeleide klasse maken en de constructor aanroepen, of een van de MFC-throwfuncties gebruiken, zoals AfxThrowFileException, om een vooraf gedefinieerd type te genereren. Deze documentatie is alleen volledig.

CException::Delete

Met deze functie wordt gecontroleerd of het CException object is gemaakt op de heap en zo ja, wordt de delete operator voor het object aangeroepen.

void Delete();

Opmerkingen

Wanneer u een CException object verwijdert, gebruikt u de Delete lidfunctie om de uitzondering te verwijderen. Gebruik de delete operator niet rechtstreeks, omdat het CException object mogelijk een globaal object is of is gemaakt op de stack.

U kunt opgeven of het object moet worden verwijderd wanneer het object is samengesteld. Zie CException::CException voor meer informatie.

U hoeft alleen aan te roepen Delete als u het C++ try- catch -mechanisme gebruikt. Als u de MFC-macro's TRY gebruikt en CATCHdeze macro's worden deze functie automatisch aangeroepen.

Example

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

Roep deze lidfunctie aan om fouttekst in een berichtvak aan de gebruiker te melden.

virtual int ReportError(
    UINT nType = MB_OK,
    UINT nMessageID = 0);

Parameterwaarden

nType
Hiermee geeft u de stijl van het berichtvak. Pas een combinatie van de berichtvakstijlen toe op het vak. Als u deze parameter niet opgeeft, is de standaardwaarde MB_OK.

nMessageID
Hiermee geeft u de resource-id (tekenreekstabelvermelding) van een bericht op dat moet worden weergegeven als het uitzonderingsobject geen foutbericht heeft. Als 0 wordt het bericht 'Er is geen foutbericht beschikbaar' weergegeven.

Retourwaarde

Een AfxMessageBox waarde; anders 0 als er onvoldoende geheugen is om het berichtvak weer te geven. Zie AfxMessageBox voor de mogelijke retourwaarden.

Example

Hier volgt een voorbeeld van het gebruik van CException::ReportError. Zie het voorbeeld voor een ander voorbeeld voor 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();
}

Zie ook

CObject klasse
Hiƫrarchiegrafiek
Uitzonderingsverwerking