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.
Egy program végrehajtásakor számos rendellenes feltétel és hiba, úgynevezett "kivételek" fordulhatnak elő. Ezek közé tartozhatnak a memória elfogyása, az erőforrás-foglalási hibák és a fájlok megkeresésének sikertelensége.
A Microsoft Foundation osztálykönyvtára egy olyan kivételkezelési sémát használ, amely a C++ ANSI szabványbizottsága által javasolt, szigorúan modellezett sémát használja. A kivételkezelőt be kell állítani, mielőtt rendellenes helyzetet tapasztaló függvényt hívna meg. Ha a függvény rendellenes állapotba kerül, kivételt jelez, és a rendszer átadja a vezérlőt a kivételkezelőnek.
A Microsoft Foundation osztálykönyvtárában található makrók kivételkezelőket fognak beállítani. Számos más globális függvény segít speciális kivételek kibocsátásában és a programok leállításában, ha szükséges. Ezek a makrók és globális függvények a következő kategóriákba sorolhatók:
Kivételmakrók, amelyek a kivételkezelőt strukturálják.
Kivételdobó függvények), amelyek bizonyos típusú kivételeket hoznak létre.
Leállítási függvények, amelyek a program leállását okozzák.
Példákat és további részleteket a Kivételek című cikkben talál.
Kivételmakrók
| Név | Description |
|---|---|
| PRÓBÁLJA | Kódblokkot jelöl ki a kivételfeldolgozáshoz. |
| FOGÁS | Egy kódblokkot jelöl ki, amely az előző TRY-blokkból származó kivételt észleli. |
| CATCH_ALL | Kódblokkot jelöl ki az előző TRY-blokk kivételeinek befogásához. |
| AND_CATCH | Kódblokkot jelöl ki az előző TRY-blokkból származó további kivételtípusok elfogására. |
| AND_CATCH_ALL | Kódblokkot jelöl ki az előző TRY-blokkban szereplő összes többi kivételtípus elfogására. |
| END_CATCH | Véget vet az utolsó CATCH vagy AND_CATCH kódblokknak. |
| END_CATCH_ALL | Véget vet az utolsó CATCH_ALL kódblokknak. |
| VET | Megadott kivételt jelez. |
| THROW_LAST | A jelenleg kezelt kivételt a következő külső kezelőre veti. |
Exception-Throwing függvények
| Név | Description |
|---|---|
| AfxThrowArchiveException | Archív kivételt eredményez. |
| AfxThrowFileException | Fájlkivételt eredményez. |
| AfxThrowInvalidArgException | Érvénytelen argumentumkivételt eredményez. |
| AfxThrowMemoryException | Memóriakivételt jelez. |
| AfxThrowNotSupportedException | Nem támogatott kivételt eredményez. |
| AfxThrowResourceException | Windows-erőforrás nem található kivételt eredményez. |
| AfxThrowUserException | Kivételt jelez egy felhasználó által kezdeményezett programműveletben. |
Az MFC két kivételdobó függvényt biztosít, amelyek kifejezetten az OLE-kivételekhez használhatók:
OLE kivételfüggvények
| Név | Description |
|---|---|
| AfxThrowOleDispatchException | Kivételt jelez egy OLE automation függvényen belül. |
| AfxThrowOleException | OLE-kivételt jelez. |
Az adatbázis-kivételek támogatásához az adatbázisosztályok két kivételosztályt, CDBException valamint CDaoExceptionglobális függvényeket biztosítanak a kivételtípusok támogatásához:
DAO-kivételfüggvények
| Név | Description |
|---|---|
| AfxThrowDAOException | A CDaoException a saját kódjából származik. |
| AfxThrowDBException | A CDBException a saját kódjából származik. |
Az MFC a következő végződtetési függvényt biztosítja:
Megszüntetési függvények
| Név | Description |
|---|---|
| AfxAbort | Az alkalmazás leállítására hívták fel, ha végzetes hiba történik. |
próbál
TRY-blokk beállítása.
TRY
Megjegyzések
A TRY-blokk olyan kódblokkot azonosít, amely kivételeket eredményezhet. Ezeket a kivételeket a következő CATCH és AND_CATCH blokkok kezelik. A rekurzió engedélyezett: a kivételek átadhatók egy külső TRY-blokknak , figyelmen kívül hagyva őket, vagy a THROW_LAST makró használatával. Zárja be a TRY blokkot egy END_CATCH vagy END_CATCH_ALL makróval.
További információt a Kivételek című cikkben talál.
Example
Lásd a CATCH példát.
Requirements
Fejléc: afx.h
FOGÁS
Egy kódblokkot határoz meg, amely az előző TRY blokkban szereplő első kivételtípust kapja meg.
CATCH(exception_class, exception_object_pointer_name)
Paraméterek
exception_class
Megadja a tesztelni kívánt kivételtípust. A standard kivételosztályok listáját a CException osztályban találja.
exception_object_pointer_name
Megadja a makró által létrehozott kivétel-objektum mutatójának nevét. A mutató nevével elérheti a kivételobjektumot a CATCH blokkban. Ez a változó deklarálva van Önnek.
Megjegyzések
A kivételfeldolgozó kód szükség esetén kikérdezheti a kivételobjektumot, hogy további információt kapjon a kivétel konkrét okáról. Hívja meg a THROW_LAST makrót, hogy a feldolgozást a következő külső kivételkeretre váltsa. Fejezd be a TRY blokkot egy END_CATCH makróval.
Ha exception_class az osztály CException, akkor a rendszer minden kivételtípust elfog. A CObject::IsKindOf tagfüggvény használatával meghatározhatja, hogy melyik kivételt dobták ki. Többféle kivételt is jobb lehet elkapni, ha szekvenciális AND_CATCH utasításokat használ, amelyek mindegyike más kivételtípussal rendelkezik.
A kivételobjektum mutatóját a makró hozza létre. Önnek nem kell saját magát deklarálnia.
Megjegyzés:
A CATCH blokk kapcsos zárójelek által meghatározott C++ hatókörként van definiálva. Ha ebben a hatókörben deklarál változókat, azok csak ezen a hatókörön belül érhetők el. Ez a exception_object_pointer_name is vonatkozik.
A kivételekről és a CATCH makróról további információt a Kivételek című cikkben talál.
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.
TRY
{
pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG dwLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long.") , dwLength);
AfxMessageBox(str);
}
CATCH(CFileException, pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
}
AND_CATCH(CMemoryException, pEx)
{
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally,
// an application should do everything it possibly can to
// clean up properly and not call AfxAbort().
AfxAbort();
}
END_CATCH
// 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 cleanup code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
CATCH_ALL
Definiál egy kódblokkot, amely az előző TRY blokkban kidobott összes kivételtípust elkapja.
CATCH_ALL(exception_object_pointer_name)
Paraméterek
exception_object_pointer_name
Megadja a makró által létrehozott kivétel-objektum mutatójának nevét. A mutató nevével elérheti a blokkon belüli kivételobjektumot CATCH_ALL . Ez a változó deklarálva van Önnek.
Megjegyzések
A kivételfeldolgozó kód szükség esetén kikérdezheti a kivételobjektumot, hogy további információt kapjon a kivétel konkrét okáról. Hívja meg a makrót, THROW_LAST hogy a feldolgozást a következő külső kivételkeretre váltsa. Ha CATCH_ALL használ, a TRY blokkot egy END_CATCH_ALL makróval fejezheti be.
Megjegyzés:
A CATCH_ALL blokk kapcsos zárójelek által meghatározott C++ hatókörként van definiálva. Ha ebben a hatókörben deklarál változókat, azok csak ezen a hatókörön belül érhetők el.
A kivételekről további információt a Kivételek című cikkben talál.
Example
Lásd a CFile::Abort példát.
Requirements
Fejléc afx.h
AND_CATCH
Kódblokkot határoz meg az előző TRY-blokkban kidobott további kivételtípusok elfogásához.
AND_CATCH(exception_class, exception_object_pointer_name)
Paraméterek
exception_class
Megadja a tesztelni kívánt kivételtípust. A standard kivételosztályok listáját a CException osztályban találja.
exception_object_pointer_name
A makró által létrehozott kivétel-objektum mutatójának neve. A mutató nevével elérheti a kivételobjektumot a AND_CATCH blokkon belül. Ez a változó deklarálva van Önnek.
Megjegyzések
A CATCH makróval egy kivételtípust foghat, majd a AND_CATCH makrót az egyes további típusok elfogásához. Fejezd be a TRY blokkot egy END_CATCH makróval.
A kivételfeldolgozó kód szükség esetén kikérdezheti a kivételobjektumot, hogy további információt kapjon a kivétel konkrét okáról. Hívja meg a THROW_LAST makrót a AND_CATCH blokkban, hogy a feldolgozást a következő külső kivételkeretre váltsa. AND_CATCH az előző CATCH vagy AND_CATCH blokk végét jelöli.
Megjegyzés:
A AND_CATCH blokk C++ hatókörként van definiálva (kapcsos zárójelek alapján). Ha ebben a hatókörben deklarálja a változókat, ne feledje, hogy csak ezen a hatókörön belül érhetők el. Ez a exception_object_pointer_name változóra is vonatkozik.
Example
Lásd a CATCH példát.
Requirements
Fejléc afx.h
AND_CATCH_ALL
Kódblokkot határoz meg az előző TRY-blokkban kidobott további kivételtípusok elfogásához.
AND_CATCH_ALL(exception_object_pointer_name)
Paraméterek
exception_object_pointer_name
A makró által létrehozott kivétel-objektum mutatójának neve. A mutató nevével elérheti a kivételobjektumot a AND_CATCH_ALL blokkban. Ez a változó deklarálva van Önnek.
Megjegyzések
A CATCH makróval egy kivételtípust foghat, majd a AND_CATCH_ALL makrót az összes többi további típus elfogásához. Ha AND_CATCH_ALL használ, fejezd be a TRY blokkot egy END_CATCH_ALL makróval.
A kivételfeldolgozó kód szükség esetén kikérdezheti a kivételobjektumot, hogy további információt kapjon a kivétel konkrét okáról. Hívja meg a THROW_LAST makrót a AND_CATCH_ALL blokkban, hogy a feldolgozást a következő külső kivételkeretre váltsa. AND_CATCH_ALL az előző CATCH vagy AND_CATCH_ALL blokk végét jelöli.
Megjegyzés:
A AND_CATCH_ALL blokk C++ hatókörként van definiálva (kapcsos zárójelek alapján). Ha ebben a hatókörben deklarálja a változókat, ne feledje, hogy csak ezen a hatókörön belül érhetők el.
Requirements
Fejléc afx.h
END_CATCH
Az utolsó CATCH vagy AND_CATCH blokk végét jelöli.
END_CATCH
Megjegyzések
A END_CATCH makróval kapcsolatos további információkért lásd a Kivételek című cikket.
Requirements
Fejléc afx.h
END_CATCH_ALL
Az utolsó CATCH_ALL88 vagy AND_CATCH_ALL blokk végét jelöli.
END_CATCH_ALL
Requirements
Fejléc afx.h
DOBÁS (MFC)
A megadott kivételt veti ki.
THROW(exception_object_pointer)
Paraméterek
exception_object_pointer
Egy kivételobjektumra mutat, amely a következőből CExceptionszármazik: .
Megjegyzések
A THROW megszakítja a program végrehajtását, és átadja a vezérlőt a program társított CATCH blokkjának. Ha nem adta meg a CATCH blokkot, a rendszer átadja a vezérlőt egy Microsoft Foundation osztálykönyvtár modulnak, amely hibaüzenetet nyomtat ki és kilép.
További információt a Kivételek című cikkben talál.
Requirements
Fejléc afx.h
THROW_LAST
Visszadobja a kivételt a következő külső CATCH blokkba.
THROW_LAST()
Megjegyzések
Ezzel a makróval helyileg létrehozott kivételt hozhat létre. Ha olyan kivételt próbál kivenni, amelyet éppen most észlelt, az általában kiesik a hatókörből, és törlődik. A THROW_LAST a kivételt a rendszer helyesen továbbítja a következő CATCH kezelőnek.
További információt a Kivételek című cikkben talál.
Example
Lásd a CFile::Abort példát.
Requirements
Fejléc afx.h
AfxThrowArchiveException
Archív kivételt eredményez.
void AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);
Paraméterek
Okoz
Egy egész számot ad meg, amely a kivétel okát jelzi. A lehetséges értékek listáját a CArchiveException::m_cause című témakörben találja.
lpszArchiveName
A kivételt okozó objektum nevét CArchive tartalmazó sztringre mutat (ha van ilyen).
Requirements
Fejléc afx.h
AfxThrowFileException
Fájlkivételt eredményez.
void AfxThrowFileException(
int cause,
LONG lOsError = -1,
LPCTSTR lpszFileName = NULL);
Paraméterek
Okoz
Egy egész számot ad meg, amely a kivétel okát jelzi. A lehetséges értékek listáját a CFileException::m_cause című témakörben találja.
lOsError
A kivétel okát jelző operációsrendszer-hibaszámot (ha van) tartalmazza. A hibakódok listáját az operációs rendszer kézikönyvében találhatja meg.
lpszFileName
A kivételt okozó fájl nevét tartalmazó sztringre mutat (ha elérhető).
Megjegyzések
Ön felelős az ok meghatározásáért az operációs rendszer hibakódja alapján.
Requirements
Fejléc afx.h
AfxThrowInvalidArgException
Érvénytelen argumentumkivételt eredményez.
Szemantika
void AfxThrowInvalidArgException( );
Megjegyzések
Ez a függvény érvénytelen argumentumok használatakor lesz meghívva.
Requirements
Fejléc: afx.h
AfxThrowMemoryException
Memóriakivételt jelez.
void AfxThrowMemoryException();
Megjegyzések
Hívja meg ezt a függvényt, ha a mögöttes rendszermemória-kiosztók (például a malloc és a GlobalAlloc Windows függvény) hívásai meghiúsulnak. Nem kell meghívnia, new mert new automatikusan memóriakivételt fog eredményezni, ha a memóriafoglalás meghiúsul.
Requirements
Fejléc afx.h
AfxThrowNotSupportedException
Kivételt jelez, amely egy nem támogatott szolgáltatásra vonatkozó kérés eredménye.
void AfxThrowNotSupportedException();
Requirements
Fejléc afx.h
AfxThrowResourceException
Erőforrás-kivételt jelez.
void AfxThrowResourceException();
Megjegyzések
Ez a függvény általában akkor van meghívva, ha egy Windows-erőforrás nem tölthető be.
Requirements
Fejléc afx.h
AfxThrowUserException
Kivételt jelez egy végfelhasználói művelet leállításához.
void AfxThrowUserException();
Megjegyzések
Ezt a függvényt általában közvetlenül azután hívja meg a rendszer, hogy AfxMessageBox hibát jelentett a felhasználónak.
Requirements
Fejléc afx.h
AfxThrowOleDispatchException
Ezzel a függvénnyel kivételt vethet ki egy OLE automatizálási függvényen belül.
void AFXAPI AfxThrowOleDispatchException(
WORD wCode ,
LPCSTR lpszDescription,
UINT nHelpID = 0);
void AFXAPI AfxThrowOleDispatchException(
WORD wCode,
UINT nDescriptionID,
UINT nHelpID = -1);
Paraméterek
wCode
Az alkalmazásra vonatkozó hibakód.
lpszDescription
A hiba szóbeli leírása.
nDescriptionID
A verbális hiba leírásának erőforrás-azonosítója.
nHelpID
Az alkalmazás súgójának súgókörnyezete (. HLP-fájl.
Megjegyzések
A függvényhez megadott információk megjeleníthetők az autós alkalmazás (Microsoft Visual Basic vagy egy másik OLE automation-ügyfélalkalmazás) által.
Example
// Sort is method of automation class CStrArrayDoc
long CStrArrayDoc::Sort(VARIANT* vArray)
{
USES_CONVERSION;
// Type check VARIANT parameter. It should contain a BSTR array
// passed by reference. The array must be passed by reference; it is
// an in-out-parameter.
// throwing COleDispatchException allows the EXCEPINFO structure of
// IDispatch::Invoke() to set
if (V_VT(vArray) != (VT_ARRAY | VT_BSTR))
AfxThrowOleDispatchException(1001,
_T("Type Mismatch in Parameter. Pass a string array by reference"));
// ...
// ...
return 0;
}
Requirements
Fejléc afx.h
AfxThrowOleException
Létrehoz egy típusú COleException objektumot, és kivételt okoz.
void AFXAPI AfxThrowOleException(SCODE sc);
void AFXAPI AfxThrowOleException(HRESULT hr);
Paraméterek
Sc
Egy OLE állapotkód, amely a kivétel okát jelzi.
hr
Kezelje a kivétel okát jelző eredménykódot.
Megjegyzések
Az argumentumként a HRESULT-ot argumentumként használó verzió az eredménykódot a megfelelő SCODE-ra alakítja át. A HRESULT-ról és az SCODE-ról további információt a Com hibakódok struktúrája a Windows SDK-ban című témakörben talál.
Requirements
Fejléc afxdao.h
AfxThrowDaoException
Hívja meg ezt a függvényt, hogy kivételt adjon ki a CDaoException típusból a saját kódjából.
void AFXAPI AfxThrowDaoException(
int nAfxDaoError = NO_AFX_DAO_ERROR,
SCODE scode = S_OK);
Paraméterek
nAfxDaoError
Kiterjesztett DAO-hibakódot jelölő egész szám, amely a CDaoException::m_nAfxDaoError alatt felsorolt értékek egyike lehet.
scode
Egy SCODE típusú OLE hibakód a DAO-ból. További információ: CDaoException::m_scode.
Megjegyzések
A keretrendszer a következőt is meghívja AfxThrowDaoException: . A hívásban az egyik paramétert vagy mindkettőt átadhatja. Ha például a CDaoException::nAfxDaoError paraméterben definiált egyik hibát szeretné felvetni, de nem érdekli a kódparaméter , adjon át egy érvényes kódot az nAfxDaoError paraméterben, és fogadja el a kód alapértelmezett értékét.
Az MFC DAO-osztályokhoz kapcsolódó kivételekről további információt ebben a könyvben és a Kivételek: Adatbázis-kivételek című cikkben találCDaoException.
Requirements
Fejléc afxdb.h
AfxThrowDBException
Hívja meg ezt a függvényt, hogy kivételt adjon ki a saját CDBException kódjából.
void AfxThrowDBException(
RETCODE nRetCode,
CDatabase* pdb,
HSTMT hstmt);
Paraméterek
nRetCode
RETCODE típusú érték, amely meghatározza a kivételt okozó hiba típusát.
Pdb
Mutató arra az CDatabase objektumra, amely azt az adatforrás-kapcsolatot jelöli, amelyhez a kivétel társítva van.
hstmt
ODBC HSTMT-leíró, amely meghatározza azt az utasításkezelőt, amelyhez a kivétel társítva van.
Megjegyzések
A keretrendszer meghívja AfxThrowDBException , ha ODBC RETCODE-ot fogad egy ODBC API-függvény hívásából, és a RETCODE-ot kivételes feltételként értelmezi a várt hiba helyett. Előfordulhat például, hogy egy adatelérési művelet meghiúsul egy lemez olvasási hibája miatt.
Az ODBC által definiált RETCODE-értékekkel kapcsolatos információkért lásd a Windows SDK 8. fejezetének "Állapot- és hibainformációk beolvasása" című szakaszát. A kódok MFC-bővítményeiről további információt a CDBException osztályban talál.
Requirements
Fejléc afx.h
AfxAbort
Az MFC által megadott alapértelmezett leállítási függvény.
void AfxAbort();
Megjegyzések
AfxAbort az MFC-tagfüggvények belsőleg hívják meg, ha végzetes hiba történik, például egy nem kezelhető kivétel. Ritkán akkor hívhat, AfxAbort ha olyan katasztrofális hibába ütközik, amelyből nem tud helyreállítani.
Example
Lásd a CATCH példát.
Requirements
Fejléc afx.h
Lásd még
Makrók és globális változók
CException osztály
CInvalidArgException osztály