Ausnahmeverarbeitung

Wenn ein Programm ausgeführt wird, können eine Reihe von ungewöhnlichen Bedingungen und Fehlern auftreten, die als "Ausnahmen" bezeichnet werden. Dazu können speicherausfall, Ressourcenzuweisungsfehler und Fehler beim Auffinden von Dateien gehören.

Die Microsoft Foundation-Klassenbibliothek verwendet ein Ausnahmebehandlungsschema, das eng nach dem vom ANSI-Standards committee für C++ vorgeschlagenen Modell modelliert wird. Ein Ausnahmehandler muss eingerichtet werden, bevor eine Funktion aufgerufen wird, die auf eine ungewöhnliche Situation stoßen kann. Wenn die Funktion auf eine ungewöhnliche Bedingung stößt, wird eine Ausnahme ausgelöst, und das Steuerelement wird an den Ausnahmehandler übergeben.

Mehrere Makros, die in der Microsoft Foundation-Klassenbibliothek enthalten sind, richten Ausnahmehandler ein. Eine Reihe anderer globaler Funktionen helfen bei Bedarf, spezielle Ausnahmen auszulösen und Programme zu beenden. Diese Makros und globalen Funktionen sind in die folgenden Kategorien unterteilt:

  • Ausnahmemakros, die den Ausnahmehandler strukturieren.

  • Ausnahme ausgelöste Funktionen, die Ausnahmen bestimmter Typen generieren.

  • Beendigungsfunktionen, die zum Beenden des Programms führen.

Beispiele und weitere Details finden Sie im Artikel Ausnahmen.

Ausnahmemakros

Name Beschreibung
VERSUCHEN Legt einen Codeblock für die Ausnahmeverarbeitung fest.
FANGEN Legt einen Codeblock zum Abfangen einer Ausnahme aus dem vorherigen TRY-Block fest.
CATCH_ALL Legt einen Codeblock fest, um alle Ausnahmen vom vorherigen TRY-Block abzufangen.
AND_CATCH Legt einen Codeblock fest, um zusätzliche Ausnahmetypen aus dem vorherigen TRY-Block abzufangen.
AND_CATCH_ALL Legt einen Codeblock fest, um alle anderen zusätzlichen Ausnahmetypen abzufangen, die in einem vorherigen TRY-Block ausgelöst wurden.
END_CATCH Beendet den letzten CATCH - oder AND_CATCH-Codeblock .
END_CATCH_ALL Beendet den letzten CATCH_ALL Codeblock.
THROW Löst eine angegebene Ausnahme aus.
THROW_LAST Löst die derzeit behandelte Ausnahme zum nächsten äußeren Handler aus.

Ausnahme ausgelöste Funktionen

Name Beschreibung
AfxThrowArchiveException Löst eine Archiv-Ausnahme aus.
AfxThrowFileException Löst eine Datei ausnahme aus.
AfxThrowInvalidArgException Löst eine ungültige Argument-Ausnahme aus.
AfxThrowMemoryException Löst eine Speicher ausnahme aus.
AfxThrowNotSupportedException Löst eine nicht unterstützte Ausnahme aus.
AfxThrowResourceException Löst eine Nicht gefundene Windows-Ressource aus.
AfxThrowUserException Löst eine Ausnahme in einer vom Benutzer initiierten Programmaktion aus.

MFC stellt zwei Ausnahme-Auslösen-Funktionen speziell für OLE-Ausnahmen bereit:

OLE-Ausnahmefunktionen

Name Beschreibung
AfxThrowOleDispatchException Löst eine Ausnahme in einer OLE-Automatisierungsfunktion aus.
AfxThrowOleException Löst eine OLE-Ausnahme aus.

Zur Unterstützung von Datenbank exceptions stellen die Datenbankklassen zwei Ausnahmeklassen CDBException sowie CDaoExceptionglobale Funktionen zur Unterstützung der Ausnahmetypen bereit:

DAO-Ausnahmefunktionen

Name Beschreibung
AfxThrowDAOException Löst eine CDaoException aus Ihrem eigenen Code aus.
AfxThrowDBException Löst eine CDBException aus Ihrem eigenen Code aus.

MFC stellt die folgende Beendigungsfunktion bereit:

Beendigungsfunktionen

Name Beschreibung
AfxAbort Wird aufgerufen, um eine Anwendung zu beenden, wenn ein schwerwiegender Fehler auftritt.

TRY

Richtet einen TRY-Block ein.

TRY

Hinweise

Ein TRY-Block identifiziert einen Codeblock, der Ausnahmen auslösen kann. Diese Ausnahmen werden in den folgenden CATCH - und AND_CATCH-Blöcken behandelt. Rekursion ist zulässig: Ausnahmen können an einen äußeren TRY-Block übergeben werden, entweder durch Ignorieren oder Verwenden des THROW_LAST-Makros. Beenden Sie den TRY-Block mit einem END_CATCH- oder END_CATCH_ALL-Makro.

Weitere Informationen finden Sie im Artikel Ausnahmen.

Beispiel

Sehen Sie sich das Beispiel für CATCH an.

Anforderungen

Header: afx.h

FANGEN

Definiert einen Codeblock, der den ersten Ausnahmetyp abfangen soll, der im vorherigen TRY-Block ausgelöst wird.

CATCH(exception_class, exception_object_pointer_name)

Parameter

exception_class
Gibt den zu testden Ausnahmetyp an. Eine Liste der Standardausnahmeklassen finden Sie unter Klasse CException.

exception_object_pointer_name
Gibt einen Namen für einen Ausnahmeobjektzeiger an, der vom Makro erstellt wird. Sie können den Zeigernamen verwenden, um auf das Ausnahmeobjekt innerhalb des CATCH-Blocks zuzugreifen. Diese Variable wird für Sie deklariert.

Hinweise

Der Ausnahmeverarbeitungscode kann ggf. das Ausnahmeobjekt abfragen, um weitere Informationen zur spezifischen Ursache der Ausnahme zu erhalten. Rufen Sie das THROW_LAST Makro auf, um die Verarbeitung in den nächsten äußeren Ausnahmeframe zu verschieben. Beenden Sie den TRY-Block mit einem END_CATCH Makro.

Wenn exception_class die Klasse CExceptionist, werden alle Ausnahmetypen abgefangen. Sie können die CObject::IsKindOf-Memberfunktion verwenden, um zu bestimmen, welche bestimmte Ausnahme ausgelöst wurde. Eine bessere Möglichkeit, mehrere Arten von Ausnahmen abzufangen, besteht darin, sequenzielle AND_CATCH Anweisungen zu verwenden, die jeweils einen anderen Ausnahmetyp aufweisen.

Der Ausnahmeobjektzeiger wird vom Makro erstellt. Sie müssen sie nicht selbst deklarieren.

Hinweis

Der CATCH-Block wird als C++-Bereich definiert, der durch geschweifte Klammern gekennzeichnet ist. Wenn Sie Variablen in diesem Bereich deklarieren, sind sie nur innerhalb dieses Bereichs zugänglich. Dies gilt auch für exception_object_pointer_name.

Weitere Informationen zu Ausnahmen und dem CATCH-Makro finden Sie im Artikel Ausnahmen.

Beispiel

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

Definiert einen Codeblock, der alle Ausnahmetypen erfasst, die im vorherigen TRY-Block ausgelöst werden.

CATCH_ALL(exception_object_pointer_name)

Parameter

exception_object_pointer_name
Gibt einen Namen für einen Ausnahmeobjektzeiger an, der vom Makro erstellt wird. Sie können den Zeigernamen verwenden, um auf das Ausnahmeobjekt innerhalb des CATCH_ALL Blocks zuzugreifen. Diese Variable wird für Sie deklariert.

Hinweise

Der Ausnahmeverarbeitungscode kann ggf. das Ausnahmeobjekt abfragen, um weitere Informationen zur spezifischen Ursache der Ausnahme zu erhalten. Rufen Sie das Makro auf, um die THROW_LAST Verarbeitung in den nächsten äußeren Ausnahmeframe zu verschieben. Wenn Sie CATCH_ALL verwenden, beenden Sie den TRY-Block mit einem END_CATCH_ALL Makro.

Hinweis

Der CATCH_ALL Block wird als C++-Bereich definiert, der durch geschweifte Klammern definiert ist. Wenn Sie Variablen in diesem Bereich deklarieren, sind sie nur innerhalb dieses Bereichs zugänglich.

Weitere Informationen zu Ausnahmen finden Sie im Artikel "Ausnahmen".

Beispiel

Sehen Sie sich das Beispiel für CFile::Abort an.

Anforderungen

Header afx.h

AND_CATCH

Definiert einen Codeblock zum Abfangen zusätzlicher Ausnahmetypen, die in einem vorherigen TRY-Block ausgelöst werden.

AND_CATCH(exception_class, exception_object_pointer_name)

Parameter

exception_class
Gibt den zu testden Ausnahmetyp an. Eine Liste der Standardausnahmeklassen finden Sie unter Klasse CException.

exception_object_pointer_name
Ein Name für einen Ausnahmeobjektzeiger, der vom Makro erstellt wird. Sie können den Zeigernamen verwenden, um auf das Ausnahmeobjekt innerhalb des AND_CATCH-Blocks zuzugreifen. Diese Variable wird für Sie deklariert.

Hinweise

Verwenden Sie das CATCH-Makro, um einen Ausnahmetyp abzufangen, und dann das AND_CATCH Makro, um jeden nachfolgenden Typ abzufangen. Beenden Sie den TRY-Block mit einem END_CATCH Makro.

Der Ausnahmeverarbeitungscode kann ggf. das Ausnahmeobjekt abfragen, um weitere Informationen zur spezifischen Ursache der Ausnahme zu erhalten. Rufen Sie das THROW_LAST Makro innerhalb des AND_CATCH Blocks auf, um die Verarbeitung in den nächsten äußeren Ausnahmeframe zu verschieben. AND_CATCH markiert das Ende des vorherigen CATCH- oder AND_CATCH-Blocks.

Hinweis

Der AND_CATCH Block wird als C++-Bereich definiert (durch geschweifte geschweifte Klammern). Wenn Sie Variablen in diesem Bereich deklarieren, denken Sie daran, dass nur innerhalb dieses Bereichs auf sie zugegriffen werden kann. Dies gilt auch für die variable exception_object_pointer_name .

Beispiel

Sehen Sie sich das Beispiel für CATCH an.

Anforderungen

Header afx.h

AND_CATCH_ALL

Definiert einen Codeblock zum Abfangen zusätzlicher Ausnahmetypen, die in einem vorherigen TRY-Block ausgelöst werden.

AND_CATCH_ALL(exception_object_pointer_name)

Parameter

exception_object_pointer_name
Ein Name für einen Ausnahmeobjektzeiger, der vom Makro erstellt wird. Sie können den Zeigernamen verwenden, um auf das Ausnahmeobjekt innerhalb des AND_CATCH_ALL-Blocks zuzugreifen. Diese Variable wird für Sie deklariert.

Hinweise

Verwenden Sie das CATCH-Makro , um einen Ausnahmetyp abzufangen, und dann das AND_CATCH_ALL Makro, um alle anderen nachfolgenden Typen abzufangen. Wenn Sie AND_CATCH_ALL verwenden, beenden Sie den TRY-Block mit einem END_CATCH_ALL Makro.

Der Ausnahmeverarbeitungscode kann ggf. das Ausnahmeobjekt abfragen, um weitere Informationen zur spezifischen Ursache der Ausnahme zu erhalten. Rufen Sie das THROW_LAST Makro im AND_CATCH_ALL-Block auf, um die Verarbeitung in den nächsten äußeren Ausnahmeframe zu verschieben. AND_CATCH_ALL markiert das Ende des vorherigen CATCH- oder AND_CATCH_ALL-Blocks.

Hinweis

Der AND_CATCH_ALL-Block wird als C++-Bereich (durch geschweifte Klammern) definiert. Wenn Sie Variablen in diesem Bereich deklarieren, denken Sie daran, dass nur innerhalb dieses Bereichs auf sie zugegriffen werden kann.

Anforderungen

Header afx.h

END_CATCH

Markiert das Ende des letzten CATCH- oder AND_CATCH-Blocks.

END_CATCH

Hinweise

Weitere Informationen zum END_CATCH-Makro finden Sie im Artikel Ausnahmen.

Anforderungen

Header afx.h

END_CATCH_ALL

Markiert das Ende des letzten CATCH_ALL88 oder AND_CATCH_ALL Blocks.

END_CATCH_ALL

Anforderungen

Header afx.h

THROW (MFC)

Löst die angegebene Ausnahme aus.

THROW(exception_object_pointer)

Parameter

exception_object_pointer
Verweist auf ein ausnahmeobjekt, das von CException.

Hinweise

THROW unterbricht die Programmausführung und übergibt die Steuerung an den zugeordneten CATCH-Block in Ihrem Programm. Wenn Sie den CATCH-Block nicht angegeben haben, wird das Steuerelement an ein Microsoft Foundation Class Library-Modul übergeben, das eine Fehlermeldung druckt und beendet.

Weitere Informationen finden Sie im Artikel Ausnahmen.

Anforderungen

Header afx.h

THROW_LAST

Löst die Ausnahme zurück zum nächsten äußeren CATCH-Block aus.

THROW_LAST()

Hinweise

Mit diesem Makro können Sie eine lokal erstellte Ausnahme auslösen. Wenn Sie versuchen, eine Ausnahme auszuwerfen, die Sie gerade abgefangen haben, wird sie normalerweise nicht mehr im Gültigkeitsbereich angezeigt und gelöscht. Bei THROW_LAST wird die Ausnahme ordnungsgemäß an den nächsten CATCH-Handler übergeben.

Weitere Informationen finden Sie im Artikel Ausnahmen.

Beispiel

Sehen Sie sich das Beispiel für CFile::Abort an.

Anforderungen

Header afx.h

AfxThrowArchiveException

Löst eine Archiv-Ausnahme aus.

void  AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);

Parameter

cause
Gibt eine ganze Zahl an, die den Grund für die Ausnahme angibt. Eine Liste der möglichen Werte finden Sie unter "CArchiveException::m_cause".

lpszArchiveName
Verweist auf eine Zeichenfolge, die den Namen des CArchive Objekts enthält, das die Ausnahme verursacht hat (sofern verfügbar).

Anforderungen

Header afx.h

AfxThrowFileException

Löst eine Datei ausnahme aus.

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

Parameter

cause
Gibt eine ganze Zahl an, die den Grund für die Ausnahme angibt. Eine Liste der möglichen Werte finden Sie unter "CFileException::m_cause".

lOsError
Enthält die Fehlernummer des Betriebssystems (sofern verfügbar), die den Grund für die Ausnahme angibt. Eine Liste der Fehlercodes finden Sie im Betriebssystemhandbuch.

lpszFileName
Verweist auf eine Zeichenfolge mit dem Namen der Datei, die die Ausnahme verursacht hat (falls verfügbar).

Hinweise

Sie sind für die Ermittlung der Ursache auf der Grundlage des Betriebssystemfehlercodes verantwortlich.

Anforderungen

Header afx.h

AfxThrowInvalidArgException

Löst eine ungültige Argument-Ausnahme aus.

Syntax

void AfxThrowInvalidArgException( );

Hinweise

Diese Funktion wird aufgerufen, wenn ungültige Argumente verwendet werden.

Anforderungen

Header: afx.h

AfxThrowMemoryException

Löst eine Speicher ausnahme aus.

void AfxThrowMemoryException();

Hinweise

Rufen Sie diese Funktion auf, wenn Aufrufe an zugrunde liegende Systemspeicherzuordnungen (z . B. Malloc und die GlobalAlloc Windows-Funktion) fehlschlagen. Sie müssen sie new nicht aufrufen, da new eine Speicher ausnahme automatisch ausgelöst wird, wenn die Speicherzuweisung fehlschlägt.

Anforderungen

Header afx.h

AfxThrowNotSupportedException

Löst eine Ausnahme aus, die das Ergebnis einer Anforderung für ein nicht unterstütztes Feature ist.

void AfxThrowNotSupportedException();

Anforderungen

Header afx.h

AfxThrowResourceException

Löst eine Ressourcen exception aus.

void  AfxThrowResourceException();

Hinweise

Diese Funktion wird normalerweise aufgerufen, wenn eine Windows-Ressource nicht geladen werden kann.

Anforderungen

Header afx.h

AfxThrowUserException

Löst eine Ausnahme aus, um einen Endbenutzervorgang zu beenden.

void AfxThrowUserException();

Hinweise

Diese Funktion wird normalerweise unmittelbar aufgerufen, nachdem AfxMessageBox dem Benutzer ein Fehler gemeldet wurde.

Anforderungen

Header afx.h

AfxThrowOleDispatchException

Verwenden Sie diese Funktion, um eine Ausnahme in einer OLE-Automatisierungsfunktion auszuwerfen.

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

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

Parameter

wCode
Ein für Ihre Anwendung spezifischer Fehlercode.

lpszDescription
Verbale Beschreibung des Fehlers.

nDescriptionID
Ressourcen-ID für die verbale Fehlerbeschreibung.

nHelpID
Ein Hilfekontext für die Hilfe Ihrer Anwendung (. HLP)-Datei.

Hinweise

Die informationen, die dieser Funktion zur Verfügung gestellt werden, können von der fahrenden Anwendung (Microsoft Visual Basic oder einer anderen OLE-Automatisierungsclientanwendung) angezeigt werden.

Beispiel

// 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;
}

Anforderungen

Header afx.h

AfxThrowOleException

Erstellt ein Objekt vom Typ COleException und löst eine Ausnahme aus.

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

Parameter

sc
Ein OLE-Statuscode, der den Grund für die Ausnahme angibt.

Hr
Behandeln Sie einen Ergebniscode, der den Grund für die Ausnahme angibt.

Hinweise

Die Version, die ein HRESULT als Argument akzeptiert, konvertiert diesen Ergebniscode in den entsprechenden SCODE. Weitere Informationen zu HRESULT und SCODE finden Sie unter Struktur der COM-Fehlercodes im Windows SDK.

Anforderungen

Header afxdao.h

AfxThrowDaoException

Rufen Sie diese Funktion auf, um eine Ausnahme vom Typ "CDaoException " aus Ihrem eigenen Code auszuwerfen.

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

Parameter

nAfxDaoError
Ein ganzzahliger Wert, der einen erweiterten DAO-Fehlercode darstellt, der einen der unter CDaoException::m_nAfxDaoError aufgeführten Werte sein kann.

scode
Ein OLE-Fehlercode aus DAO vom Typ SCODE. Weitere Informationen finden Sie unter "CDaoException::m_scode".

Hinweise

Das Framework ruft auch .AfxThrowDaoException In Ihrem Aufruf können Sie einen der Parameter oder beides übergeben. Wenn Sie beispielsweise einen der in CDaoException::nAfxDaoError definierten Fehler auslösen möchten, sich aber nicht um den scode-Parameter kümmern, übergeben Sie einen gültigen Code im nAfxDaoError-Parameter und akzeptieren den Standardwert für scode.

Informationen zu Ausnahmen im Zusammenhang mit den MFC DAO-Klassen finden Sie CDaoException in diesem Buch und im Artikel Exceptions: Database Exceptions.

Anforderungen

Header afxdb.h

AfxThrowDBException

Rufen Sie diese Funktion auf, um eine Ausnahme vom Typ CDBException aus Ihrem eigenen Code auszuwerfen.

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

Parameter

nRetCode
Ein Wert vom Typ RETCODE, der den Typ des Fehlers definiert, der dazu führte, dass die Ausnahme ausgelöst wurde.

pdb
Ein Zeiger auf das CDatabase Objekt, das die Datenquellenverbindung darstellt, mit der die Ausnahme verknüpft ist.

hstmt
Ein ODBC-HSTMT-Handle, das das Anweisungshandle angibt, dem die Ausnahme zugeordnet ist.

Hinweise

Das Framework ruft auf AfxThrowDBException , wenn es einen ODBC-RETCODE von einem Aufruf einer ODBC-API-Funktion empfängt und den RETCODE nicht als erwarteter Fehler, sondern als ausnahmebedingung interpretiert. Ein Datenzugriffsvorgang kann beispielsweise aufgrund eines Datenträgerlesefehlers fehlschlagen.

Informationen zu den von ODBC definierten RETCODE-Werten finden Sie in Kapitel 8, "Abrufen von Status- und Fehlerinformationen", im Windows SDK. Weitere Informationen zu MFC-Erweiterungen für diese Codes finden Sie unter "CDBException".For information about MFC extensions to these codes, see class CDBException.

Anforderungen

Header afx.h

AfxAbort

Die standardmäßige Beendigungsfunktion, die von MFC bereitgestellt wird.

void  AfxAbort();

Hinweise

AfxAbort wird intern von MFC-Memberfunktionen aufgerufen, wenn ein schwerwiegender Fehler auftritt, z. B. eine ausnahme, die nicht behandelt werden kann. Sie können den seltenen Fall aufrufen AfxAbort , wenn ein katastrophaler Fehler auftritt, von dem Sie sich nicht erholen können.

Beispiel

Sehen Sie sich das Beispiel für CATCH an.

Anforderungen

Header afx.h

Siehe auch

Makros und Globalen
CException-Klasse
CInvalidArgException-Klasse