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


Kivételfeldolgozás

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