Share via


Uitzonderingsverwerking

Opmerking

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

Wanneer een programma wordt uitgevoerd, kunnen er een aantal abnormale omstandigheden en fouten met de naam 'uitzonderingen' optreden. Dit kan bijvoorbeeld gaan om onvoldoende geheugen, resourcetoewijzingsfouten en het niet vinden van bestanden.

De Microsoft Foundation Class Library maakt gebruik van een uitzonderingsafhandelingsschema dat nauw is gemodelleerd naar het model dat is voorgesteld door het ANSI-standaardencomité voor C++. Een uitzonderingshandler moet worden ingesteld voordat u een functie aanroept die een abnormale situatie kan ondervinden. Als de functie een abnormale toestand tegenkomt, genereert deze een uitzondering en wordt er een controle doorgegeven aan de uitzonderingshandler.

Verschillende macro's die deel uitmaken van de Microsoft Foundation Class Library, stellen uitzonderingshandlers in. Een aantal andere globale functies helpt bij het genereren van gespecialiseerde uitzonderingen en het beëindigen van programma's, indien nodig. Deze macro's en globale functies vallen in de volgende categorieën:

  • Uitzonderingsmacro's, die uw uitzonderingshandler structuren.

  • Functies voor het genereren van uitzonderingen), waarmee uitzonderingen van specifieke typen worden gegenereerd.

  • Beëindigingsfuncties, waardoor programma-beëindiging wordt veroorzaakt.

Zie het artikel Uitzonderingen voor voorbeelden en meer informatie.

Uitzonderingsmacro's

Naam Description
PROBEREN Hiermee wordt een codeblok voor uitzonderingsverwerking aangewezen.
VANGEN Hiermee wordt een codeblok aangewezen voor het vangen van een uitzondering van het voorgaande TRY-blok .
CATCH_ALL Hiermee wordt een codeblok aangewezen voor het opsporen van alle uitzonderingen van het voorgaande TRY-blok .
AND_CATCH Hiermee wordt een codeblok aangewezen voor het vangen van extra uitzonderingstypen uit het voorgaande TRY-blok .
AND_CATCH_ALL Hiermee wordt een codeblok aangewezen voor het vangen van alle andere extra uitzonderingstypen die zijn gegenereerd in een voorgaande TRY-blok .
END_CATCH Hiermee wordt het laatste CATCH - of AND_CATCH-codeblok beëindigd.
END_CATCH_ALL Hiermee wordt het laatste codeblok CATCH_ALL beëindigd.
WERPEN Genereert een opgegeven uitzondering.
THROW_LAST Hiermee wordt de momenteel afgehandelde uitzondering naar de volgende buitenste handler gegenereerd.

Exception-Throwing Functions

Naam Description
AfxThrowArchiveException Genereert een archief-uitzondering.
AfxThrowFileException Genereert een bestandsonderzondering.
AfxThrowInvalidArgException Genereert een ongeldige argument-uitzondering.
AfxThrowMemoryException Genereert een geheugen-uitzondering.
AfxThrowNotSupportedException Genereert een niet-ondersteunde uitzondering.
AfxThrowResourceException Genereert een Windows-resource-uitzondering die niet is gevonden.
AfxThrowUserException Genereert een uitzondering in een door de gebruiker geïnitieerde programmaactie.

MFC biedt twee uitzonderingsfuncties die specifiek zijn bedoeld voor OLE-uitzonderingen:

OLE-uitzonderingsfuncties

Naam Description
AfxThrowOleDispatchException Genereert een uitzondering binnen een OLE-automatiseringsfunctie.
AfxThrowOleException Genereert een OLE-uitzondering.

Ter ondersteuning van database-uitzonderingen bieden de databaseklassen twee uitzonderingsklassen en CDaoExceptionglobale functies ter ondersteuning van de uitzonderingstypenCDBException:

DAO-uitzonderingsfuncties

Naam Description
AfxThrowDAOException Genereert een CDaoException uit uw eigen code.
AfxThrowDBException Genereert een CDBException uit uw eigen code.

MFC biedt de volgende beëindigingsfunctie:

Beëindigingsfuncties

Naam Description
AfxAbort Wordt aangeroepen om een toepassing te beëindigen wanneer er een fatale fout optreedt.

TRY

Hiermee stelt u een TRY-blok in.

TRY

Opmerkingen

Een TRY-blok identificeert een codeblok dat uitzonderingen kan genereren. Deze uitzonderingen worden verwerkt in de volgende CATCH - en AND_CATCH-blokken . Recursie is toegestaan: uitzonderingen kunnen worden doorgegeven aan een buitenste TRY-blok door ze te negeren of door de THROW_LAST macro te gebruiken. Beëindig het TRY-blok met een END_CATCH of END_CATCH_ALL macro.

Zie het artikel Uitzonderingen voor meer informatie.

Example

Zie het voorbeeld voor CATCH.

Requirements

Koptekst: afx.h

VANGEN

Definieert een codeblok waarmee het eerste uitzonderingstype wordt onderschept dat is opgetreden in het voorgaande TRY-blok .

CATCH(exception_class, exception_object_pointer_name)

Parameterwaarden

exception_class
Hiermee geeft u het uitzonderingstype op waarvoor moet worden getest. Zie klasse CException voor een lijst met standaarduitzonderingsklassen.

exception_object_pointer_name
Hiermee geeft u een naam op voor een uitzonderingsobjectaanwijzer die door de macro wordt gemaakt. U kunt de aanwijzernaam gebruiken om toegang te krijgen tot het uitzonderingsobject in het CATCH-blok . Deze variabele wordt voor u gedeclareerd.

Opmerkingen

De uitzonderingsverwerkingscode kan het uitzonderingsobject, indien van toepassing, ondervragen voor meer informatie over de specifieke oorzaak van de uitzondering. Roep de THROW_LAST macro aan om de verwerking te verplaatsen naar het volgende buitenste uitzonderingskader. Beëindig het TRY-blok met een END_CATCH macro.

Als exception_class de klasse CExceptionis, worden alle uitzonderingstypen gevangen. U kunt de functie CObject::IsKindOf-lid gebruiken om te bepalen welke specifieke uitzondering is opgetreden. Een betere manier om verschillende soorten uitzonderingen te ondervangen, is door sequentiële AND_CATCH instructies te gebruiken, elk met een ander uitzonderingstype.

De aanwijzer voor uitzonderingsobjecten wordt gemaakt door de macro. U hoeft het zelf niet te declareren.

Opmerking

Het CATCH-blok wordt gedefinieerd als een C++-bereik dat wordt afgelijnd door accolades. Als u variabelen in dit bereik declareert, zijn ze alleen toegankelijk binnen dat bereik. Dit geldt ook voor exception_object_pointer_name.

Zie het artikel Uitzonderingen voor meer informatie over uitzonderingen en de CATCH-macro.

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

Hiermee definieert u een codeblok waarmee alle uitzonderingstypen worden onderschept die in het voorgaande TRY-blok zijn opgetreden.

CATCH_ALL(exception_object_pointer_name)

Parameterwaarden

exception_object_pointer_name
Hiermee geeft u een naam op voor een uitzonderingsobjectaanwijzer die door de macro wordt gemaakt. U kunt de naam van de aanwijzer gebruiken om toegang te krijgen tot het uitzonderingsobject in het CATCH_ALL blok. Deze variabele wordt voor u gedeclareerd.

Opmerkingen

De uitzonderingsverwerkingscode kan het uitzonderingsobject, indien van toepassing, ondervragen voor meer informatie over de specifieke oorzaak van de uitzondering. Roep de THROW_LAST macro aan om de verwerking te verplaatsen naar het volgende buitenste uitzonderingskader. Als u CATCH_ALL gebruikt, beëindigt u het TRY-blok met een END_CATCH_ALL macro.

Opmerking

Het CATCH_ALL blok wordt gedefinieerd als een C++-bereik dat is afgelijnd door accolades. Als u variabelen in dit bereik declareert, zijn ze alleen toegankelijk binnen dat bereik.

Zie het artikel Uitzonderingen voor meer informatie over uitzonderingen.

Example

Zie het voorbeeld voor CFile::Abort.

Requirements

Header afx.h

AND_CATCH

Definieert een codeblok voor het vangen van extra uitzonderingstypen die zijn gegenereerd in een voorgaande TRY-blok .

AND_CATCH(exception_class, exception_object_pointer_name)

Parameterwaarden

exception_class
Hiermee geeft u het uitzonderingstype op waarvoor moet worden getest. Zie klasse CException voor een lijst met standaarduitzonderingsklassen.

exception_object_pointer_name
Een naam voor een uitzonderingsobjectaanwijzer die door de macro wordt gemaakt. U kunt de naam van de aanwijzer gebruiken om toegang te krijgen tot het uitzonderingsobject in het AND_CATCH blok. Deze variabele wordt voor u gedeclareerd.

Opmerkingen

Gebruik de CATCH-macro om één uitzonderingstype te vangen en vervolgens de AND_CATCH macro om elk volgend type te vangen. Beëindig het TRY-blok met een END_CATCH macro.

De uitzonderingsverwerkingscode kan het uitzonderingsobject, indien van toepassing, ondervragen voor meer informatie over de specifieke oorzaak van de uitzondering. Roep de THROW_LAST macro in het AND_CATCH blok aan om de verwerking naar het volgende buitenste uitzonderingskader te verplaatsen. AND_CATCH het einde van het voorgaande CATCH - of AND_CATCH-blok markeert.

Opmerking

Het AND_CATCH blok wordt gedefinieerd als een C++-bereik (afgelijnd door accolades). Als u variabelen in dit bereik declareert, moet u er rekening mee houden dat ze alleen toegankelijk zijn binnen dat bereik. Dit geldt ook voor de variabele exception_object_pointer_name .

Example

Zie het voorbeeld voor CATCH.

Requirements

Header afx.h

AND_CATCH_ALL

Definieert een codeblok voor het vangen van extra uitzonderingstypen die zijn gegenereerd in een voorgaande TRY-blok .

AND_CATCH_ALL(exception_object_pointer_name)

Parameterwaarden

exception_object_pointer_name
Een naam voor een uitzonderingsobjectaanwijzer die door de macro wordt gemaakt. U kunt de naam van de aanwijzer gebruiken om toegang te krijgen tot het uitzonderingsobject in het AND_CATCH_ALL blok. Deze variabele wordt voor u gedeclareerd.

Opmerkingen

Gebruik de CATCH-macro om één uitzonderingstype te vangen en vervolgens de AND_CATCH_ALL macro om alle andere volgende typen te vangen. Als u AND_CATCH_ALL gebruikt, beëindigt u het TRY-blok met een END_CATCH_ALL macro.

De uitzonderingsverwerkingscode kan het uitzonderingsobject, indien van toepassing, ondervragen voor meer informatie over de specifieke oorzaak van de uitzondering. Roep de THROW_LAST macro in het AND_CATCH_ALL blok aan om de verwerking te verplaatsen naar het volgende buitenste uitzonderingskader. AND_CATCH_ALL het einde van het voorgaande CATCH - of AND_CATCH_ALL-blok markeert.

Opmerking

Het AND_CATCH_ALL blok wordt gedefinieerd als een C++-bereik (afgelijnd door accolades). Als u variabelen in dit bereik declareert, moet u er rekening mee houden dat ze alleen toegankelijk zijn binnen dat bereik.

Requirements

Header afx.h

END_CATCH

Hiermee wordt het einde van het laatste CATCH - of AND_CATCH-blok gemarkeerd.

END_CATCH

Opmerkingen

Zie het artikel Uitzonderingen voor meer informatie over de macro END_CATCH.

Requirements

Header afx.h

END_CATCH_ALL

Hiermee wordt het einde van het laatste CATCH_ALL88 of AND_CATCH_ALL blok gemarkeerd.

END_CATCH_ALL

Requirements

Header afx.h

THROW (MFC)

Hiermee wordt de opgegeven uitzondering gegenereerd.

THROW(exception_object_pointer)

Parameterwaarden

exception_object_pointer
Verwijst naar een uitzonderingsobject dat is afgeleid van CException.

Opmerkingen

THROW onderbreekt de uitvoering van het programma, waarbij het besturingselement wordt doorgegeven aan het bijbehorende CATCH-blok in uw programma. Als u het CATCH-blok niet hebt opgegeven, wordt het besturingselement doorgegeven aan een Microsoft Foundation Class Library-module waarmee een foutbericht wordt afgedrukt en wordt afgesloten.

Zie het artikel Uitzonderingen voor meer informatie.

Requirements

Header afx.h

THROW_LAST

Hiermee wordt de uitzondering teruggezet naar het volgende buitenste CATCH-blok .

THROW_LAST()

Opmerkingen

Met deze macro kunt u een lokaal gemaakte uitzondering genereren. Als u een uitzondering probeert te genereren die u zojuist hebt opgevangen, wordt deze normaal gesproken buiten het bereik en verwijderd. Met THROW_LAST wordt de uitzondering correct doorgegeven aan de volgende CATCH-handler .

Zie het artikel Uitzonderingen voor meer informatie.

Example

Zie het voorbeeld voor CFile::Abort.

Requirements

Header afx.h

AfxThrowArchiveException

Genereert een archief-uitzondering.

void  AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);

Parameterwaarden

Oorzaak
Hiermee geeft u een geheel getal op dat de reden voor de uitzondering aangeeft. Zie CArchiveException::m_cause voor een lijst met mogelijke waarden.

lpszArchiveName
Verwijst naar een tekenreeks met de naam van het CArchive object dat de uitzondering heeft veroorzaakt (indien beschikbaar).

Requirements

Header afx.h

AfxThrowFileException

Genereert een bestandsonderzondering.

void AfxThrowFileException(
    int cause,
    LONG lOsError = -1,
    LPCTSTR lpszFileName = NULL);

Parameterwaarden

Oorzaak
Hiermee geeft u een geheel getal op dat de reden voor de uitzondering aangeeft. Zie CFileException::m_cause voor een lijst met mogelijke waarden.

lOsError
Bevat het foutnummer van het besturingssysteem (indien beschikbaar) waarin de reden voor de uitzondering wordt aangegeven. Zie de handleiding van uw besturingssysteem voor een lijst met foutcodes.

lpszFileName
Verwijst naar een tekenreeks met de naam van het bestand dat de uitzondering heeft veroorzaakt (indien beschikbaar).

Opmerkingen

U bent verantwoordelijk voor het bepalen van de oorzaak op basis van de foutcode van het besturingssysteem.

Requirements

Header afx.h

AfxThrowInvalidArgException

Genereert een ongeldige argument-uitzondering.

Syntaxis

void AfxThrowInvalidArgException( );

Opmerkingen

Deze functie wordt aangeroepen wanneer ongeldige argumenten worden gebruikt.

Requirements

koptekst: afx.h

AfxThrowMemoryException

Genereert een geheugen-uitzondering.

void AfxThrowMemoryException();

Opmerkingen

Roep deze functie aan als aanroepen naar onderliggende systeemgeheugentoewijzingen (zoals malloc en de functie GlobalAlloc Windows) mislukken. U hoeft deze new niet aan te roepen omdat new er automatisch een geheugentoezondering wordt gegenereerd als de geheugentoewijzing mislukt.

Requirements

Header afx.h

AfxThrowNotSupportedException

Genereert een uitzondering die het resultaat is van een aanvraag voor een niet-ondersteunde functie.

void AfxThrowNotSupportedException();

Requirements

Header afx.h

AfxThrowResourceException

Genereert een resource-uitzondering.

void  AfxThrowResourceException();

Opmerkingen

Deze functie wordt normaal gesproken aangeroepen wanneer een Windows-resource niet kan worden geladen.

Requirements

Header afx.h

AfxThrowUserException

Hiermee genereert u een uitzondering om een bewerking door eindgebruikers te stoppen.

void AfxThrowUserException();

Opmerkingen

Deze functie wordt normaal gesproken onmiddellijk aangeroepen nadat AfxMessageBox een fout aan de gebruiker is gemeld.

Requirements

Header afx.h

AfxThrowOleDispatchException

Gebruik deze functie om een uitzondering te genereren binnen een OLE-automatiseringsfunctie.

void AFXAPI AfxThrowOleDispatchException(
    WORD wCode ,
    LPCSTR lpszDescription,
    UINT nHelpID = 0);

void AFXAPI AfxThrowOleDispatchException(
    WORD wCode,
    UINT nDescriptionID,
    UINT nHelpID = -1);

Parameterwaarden

wCode
Een foutcode die specifiek is voor uw toepassing.

lpszDescription
Mondelinge beschrijving van de fout.

nDescriptionID
Resource-id voor de beschrijving van de mondelinge fout.

nHelpID
Een Help-context voor de Help van uw toepassing (. HLP)-bestand.

Opmerkingen

De informatie die aan deze functie wordt verstrekt, kan worden weergegeven door de rijtoepassing (Microsoft Visual Basic of een andere OLE Automation-clienttoepassing).

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

Header afx.h

AfxThrowOleException

Hiermee maakt u een object van het type COleException en genereert u een uitzondering.

void AFXAPI AfxThrowOleException(SCODE sc);
void AFXAPI AfxThrowOleException(HRESULT hr);

Parameterwaarden

Sc
Een OLE-statuscode die de reden voor de uitzondering aangeeft.

hr-
Verwerken naar een resultaatcode die de reden voor de uitzondering aangeeft.

Opmerkingen

De versie die een HRESULT als argument gebruikt, converteert die resultaatcode naar de bijbehorende SCODE. Zie Structuur van COM-foutcodes in de Windows SDK voor meer informatie over HRESULT en SCODE.

Requirements

Header afxdao.h

AfxThrowDaoException

Roep deze functie aan om een uitzondering van het type CDaoException uit uw eigen code te genereren.

void AFXAPI AfxThrowDaoException(
    int nAfxDaoError = NO_AFX_DAO_ERROR,
    SCODE scode = S_OK);

Parameterwaarden

nAfxDaoError
Een geheel getal dat een uitgebreide DAO-foutcode vertegenwoordigt. Dit kan een van de waarden zijn die worden vermeld onder CDaoException::m_nAfxDaoError.

scode
Een OLE-foutcode van DAO, van het type SCODE. Zie CDaoException::m_scode voor meer informatie.

Opmerkingen

Het framework roept AfxThrowDaoExceptionook aan. In uw gesprek kunt u een van de parameters of beide doorgeven. Als u bijvoorbeeld een van de fouten wilt genereren die zijn gedefinieerd in CDaoException::nAfxDaoError , maar u niet om de codeparameter geeft, geeft u een geldige code door in de parameter nAfxDaoError en accepteert u de standaardwaarde voor scode.

Zie de klasse CDaoException in dit boek en het artikel Uitzonderingen: Database-uitzonderingen voor informatie over uitzonderingen met betrekking tot de MFC DAO-klassen.

Requirements

Header afxdb.h

AfxThrowDBException

Roep deze functie aan om een uitzondering van het type CDBException uit uw eigen code te genereren.

void AfxThrowDBException(
    RETCODE nRetCode,
    CDatabase* pdb,
    HSTMT hstmt);

Parameterwaarden

nRetCode
Een waarde van het type RETCODE, waarmee het type fout wordt gedefinieerd waardoor de uitzondering werd gegenereerd.

Vob
Een aanwijzer naar het CDatabase object dat de gegevensbronverbinding vertegenwoordigt waaraan de uitzondering is gekoppeld.

hstmt
Een ODBC HSTMT-ingang waarmee de instructiehandgreep wordt opgegeven waaraan de uitzondering is gekoppeld.

Opmerkingen

Het framework roept AfxThrowDBException aan wanneer een ODBC RETCODE wordt ontvangen van een aanroep naar een ODBC-API-functie en interpreteert de RETCODE als een uitzonderlijke voorwaarde in plaats van een verwachte fout. Een gegevenstoegangsbewerking kan bijvoorbeeld mislukken vanwege een schijfleesfout.

Zie hoofdstuk 8, 'Status- en foutinformatie ophalen' in de Windows SDK voor meer informatie over de RETCODE-waarden die zijn gedefinieerd door ODBC. Zie klasse CDBException voor informatie over MFC-extensies voor deze codes.

Requirements

Header afx.h

AfxAbort

De standaardbeëindigingsfunctie die door MFC wordt geleverd.

void  AfxAbort();

Opmerkingen

AfxAbort wordt intern aangeroepen door MFC-lidfuncties wanneer er een fatale fout is, zoals een onopgestoken uitzondering die niet kan worden afgehandeld. U kunt in zeldzame gevallen aanroepen AfxAbort wanneer u een catastrofale fout tegenkomt waaruit u niet kunt herstellen.

Example

Zie het voorbeeld voor CATCH.

Requirements

Header afx.h

Zie ook

macro's en globalen
CException-klasse
Klasse CInvalidArgException