Megosztás a következőn keresztül:


CException osztály

Megjegyzés:

A Microsoft Foundation Classes (MFC) könyvtár továbbra is támogatott. A továbbiakban azonban nem adunk hozzá funkciókat, és nem frissítjük a dokumentációt.

A Microsoft Foundation osztálytárban lévő összes kivétel alaposztálya.

Szemantika

class AFX_NOVTABLE CException : public CObject

Tagok

Nyilvános konstruktorok

Név Description
CException::CException Egy CException objektumot hoz létre.

Nyilvános metódusok

Név Description
CException::Delete CException Objektum törlése.
CException::ReportError Hibaüzenetet jelent egy üzenetmezőben a felhasználónak.

Megjegyzések

Mivel CException egy absztrakt alaposztály, amelyet nem hozhat létre CException közvetlenül, származtatott osztályok objektumait kell létrehoznia. Ha saját CExceptionstílusosztályt kell létrehoznia, használja a fent felsorolt származtatott osztályok egyikét modellként. Győződjön meg arról, hogy a származtatott osztály is használ IMPLEMENT_DYNAMIC.

A származtatott osztályok és azok leírása az alábbiakban látható:

Név Description
CSimpleException Alaposztály erőforrás-kritikus MFC-kivételekhez
CInvalidArgException Érvénytelen argumentumkivételi feltétel
CMemoryException Memóriakivétel
CNotSupportedException Nem támogatott művelet kérése
CArchiveException Archív kivétel
CFileException Fájlspecifikus kivétel
CResourceException A Windows-erőforrás nem található vagy nem creatable
COleException OLE-kivétel
CDBException Adatbázis-kivétel (vagyis az Open Database Connectivity alapján az MFC-adatbázisosztályok esetében felmerülő kivételfeltételek)
COleDispatchException OLE-kézbesítési (automatizálási) kivétel
CUserException Kivétel, amely azt jelzi, hogy nem található erőforrás
CDaoException Adathozzáférési objektum kivétele (azaz a DAO-osztályokra vonatkozó kivételfeltételek)
CInternetException Internetes kivétel (vagyis az internetes osztályokra vonatkozó kivételfeltételek).

Ezek a kivételek a , , THROW_LAST, try, catchand_catch, és end_catch makrókkal használhatókTHROW. A kivételekről további információt a Kivételfeldolgozás című témakörben vagy a Kivételkezelés (MFC) című cikkben talál.

Egy adott kivétel elfogásához használja a megfelelő származtatott osztályt. Az összes kivételtípust a származtatott osztályok megkülönböztetéséhez CExceptionhasználjaCException, majd használja CObject::IsKindOf a különbséget. Vegye figyelembe, hogy CObject::IsKindOf csak a IMPLEMENT_DYNAMIC makróval deklarált osztályok esetében működik, hogy kihasználhassa a dinamikus típusellenőrzés előnyeit. Minden CExceptionlétrehozott származtatott osztálynak a makrót is használnia IMPLEMENT_DYNAMIC kell.

A felhasználó kivételeivel kapcsolatos részleteket a felhasználó meghívásával GetErrorMessage vagy ReportErrorkét olyan tagfüggvény meghívásával jelentheti be, amelyek bármelyik CExceptionszármaztatott osztálysal működnek.

Ha az egyik makró kivételt kap, az CException objektum automatikusan törlődik, ne törölje saját maga. Ha egy kulcsszóval catch kivételt kap, az nem törlődik automatikusan. A kivételobjektumok törlésének időpontjáról további információt a Kivételkezelés (MFC) című cikkben talál.

Öröklési hierarchia

CObject

CException

Requirements

Fejléc:afx.h

CException::CException

Ez a tagfüggvény létrehoz egy objektumot CException .

explicit CException(BOOL bAutoDelete);

Paraméterek

b_AutoDelete
Adja meg TRUE , hogy az CException objektum memóriája le van-e foglalva a halomra. Ez az objektum törlését eredményezi CException , amikor a Delete tagfüggvényt meghívják a kivétel törlésére. Adja meg FALSE , hogy az CException objektum a veremen van-e, vagy globális objektum-e. Ebben az esetben az CException objektum nem törlődik a Delete tagfüggvény meghívásakor.

Megjegyzések

Ezt a konstruktort általában soha nem kell közvetlenül meghívnia. A kivételt okozó függvényeknek létre kell hozniuk egy CException-származtatott osztály egy példányát, és meg kell hívniuk a konstruktort, vagy az MFC dobófüggvények egyikét kell használniuk, például AfxThrowFileExceptionegy előre definiált típust. Ez a dokumentáció csak a teljesség érdekében érhető el.

CException::Delete

Ez a függvény ellenőrzi, hogy az CException objektum létre lett-e hozva a halomra, és ha igen, meghívja az delete objektum operátorát.

void Delete();

Megjegyzések

Objektum törlésekor CException a Delete tagfüggvény használatával törölje a kivételt. Ne használja közvetlenül az delete operátort, mert lehet, hogy az CException objektum globális objektum, vagy a veremen lett létrehozva.

Megadhatja, hogy az objektumot törölni kell-e az objektum létrehozásakor. További információért lásd CException::CException.

Csak akkor kell hívnia Delete , ha a C++ try- catch mechanizmust használja. Ha MFC-makrókat TRY használ, és CATCHezek a makrók automatikusan meghívják ezt a függvényt.

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

Hívja meg ezt a tagfüggvényt, hogy jelentse a hibaszöveget egy üzenetmezőben a felhasználónak.

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

Paraméterek

nType
Megadja az üzenetmező stílusát. Alkalmazza az üzenetdobozstílusok tetszőleges kombinációját a dobozra. Ha nem adja meg ezt a paramétert, az alapértelmezett érték a következő MB_OK.

nMessageID
Megadja egy üzenet erőforrás-azonosítóját (sztringtábla-bejegyzését), amely akkor jelenik meg, ha a kivételobjektum nem tartalmaz hibaüzenetet. Ha 0, a "Nem érhető el hibaüzenet" üzenet jelenik meg.

Visszaadott érték

Érték AfxMessageBox ; egyébként 0, ha nincs elegendő memória az üzenetmező megjelenítéséhez. Tekintse meg AfxMessageBox a lehetséges visszatérési értékeket.

Example

Íme egy példa a .CException::ReportError Egy másik példát a következő példában CATCHtalál: .

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

Lásd még

CObject osztály
hierarchiadiagram
Kivételfeldolgozás