Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
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();
}