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 CDaoException
globale 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 CException
ist, 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