Zpracování výjimek
Při spuštění programu může dojít k několika neobvyklým stavům a chybám označovaným jako výjimky. Může se jednat o nedostatek paměti, chyby přidělení prostředků a selhání při hledání souborů.
Knihovna tříd Microsoft Foundation používá schéma zpracování výjimek, které je modelováno těsně po modelu navrženém výborem standardů ANSI pro C++. Obslužná rutina výjimky musí být nastavena před voláním funkce, která může narazit na neobvyklou situaci. Pokud funkce narazí na neobvyklou podmínku, vyvolá výjimku a ovládací prvek se předá obslužné rutině výjimky.
Několik maker zahrnutých v knihovně tříd Microsoft Foundation nastaví obslužné rutiny výjimek. Řada dalších globálních funkcí pomáhá v případě potřeby vyvolat specializované výjimky a ukončit programy. Tato makra a globální funkce spadají do následujících kategorií:
Makra výjimek, která strukturují obslužnou rutinu výjimky.
Funkce vyvolání výjimek), které generují výjimky konkrétních typů.
Funkce ukončení, které způsobují ukončení programu
Příklady a další podrobnosti najdete v článku Výjimky.
Makra výjimek
Název | Popis |
---|---|
ZKUSIT | Určuje blok kódu pro zpracování výjimek. |
CHYTIT | Určuje blok kódu pro zachycení výjimky z předchozího bloku TRY . |
CATCH_ALL | Určuje blok kódu pro zachycení všech výjimek z předchozího bloku TRY . |
AND_CATCH | Určuje blok kódu pro zachycení dalších typů výjimek z předchozího bloku TRY . |
AND_CATCH_ALL | Určuje blok kódu pro zachycení všech dalších dalších typů výjimek vyvolaných v předchozím bloku TRY . |
END_CATCH | Ukončí poslední blok kódu CATCH nebo AND_CATCH . |
END_CATCH_ALL | Ukončí poslední blok kódu CATCH_ALL . |
HODIT | Vyvolá zadanou výjimku. |
THROW_LAST | Vyvolá aktuálně zpracovávanou výjimku na další vnější obslužnou rutinu. |
Funkce vyvolání výjimek
Název | Popis |
---|---|
AfxThrowArchiveException | Vyvolá výjimku archivu. |
AfxThrowFileException | Vyvolá výjimku souboru. |
AfxThrowInvalidArgException | Vyvolá výjimku neplatného argumentu. |
AfxThrowMemoryException | Vyvolá výjimku paměti. |
AfxThrowNotSupportedException | Vyvolá výjimku, která není podporována. |
AfxThrowResourceException | Vyvolá výjimku typu Prostředek systému Windows, která nebyla nalezena. |
AfxThrowUserException | Vyvolá výjimku v akci programu iniciované uživatelem. |
MFC poskytuje dvě funkce vyvolané výjimkami speciálně pro výjimky OLE:
Funkce výjimek OLE
Název | Popis |
---|---|
AfxThrowOleDispatchException | Vyvolá výjimku v rámci funkce automatizace OLE. |
AfxThrowOleException | Vyvolá výjimku OLE. |
Pro podporu výjimek databáze třídy databáze poskytují dvě třídy CDBException
výjimek a CDaoException
a globální funkce pro podporu typů výjimek:
Funkce výjimek DAO
Název | Popis |
---|---|
AfxThrowDAOException | Vyvolá výjimku CDaoException z vlastního kódu. |
AfxThrowDBException | Vyvolá výjimku CDBException z vlastního kódu. |
MFC poskytuje následující funkci ukončení:
Funkce ukončení
Název | Popis |
---|---|
AfxAbort | Volá se k ukončení aplikace, když dojde k závažné chybě. |
TRY
Nastaví blok TRY .
TRY
Poznámky
Blok TRY identifikuje blok kódu, který může vyvolat výjimky. Tyto výjimky se zpracovávají v následujících blocích CATCH a AND_CATCH . Rekurze je povolena: Výjimky mohou být předány do vnějšího bloku TRY , a to buď tak, že je ignorujete nebo použijete THROW_LAST makro. Ukončete blok TRY END_CATCH nebo END_CATCH_ALL makrem.
Další informace najdete v článku Výjimky.
Příklad
Podívejte se na příklad funkce CATCH.
Požadavky
Hlavička: afx.h
CHYTIT
Definuje blok kódu, který zachytí první typ výjimky vyvolaný v předchozím bloku TRY .
CATCH(exception_class, exception_object_pointer_name)
Parametry
exception_class
Určuje typ výjimky, pro který se má testovat. Seznamstandardních
exception_object_pointer_name
Určuje název ukazatele objektu výjimky, který bude vytvořen makrem. Název ukazatele můžete použít pro přístup k objektu výjimky v rámci bloku CATCH . Tato proměnná je pro vás deklarována.
Poznámky
Kód pro zpracování výjimek může v případě potřeby interrogovat objekt výjimky, aby získal další informace o konkrétní příčině výjimky. Vyvoláte makro THROW_LAST, které přesune zpracování na další vnější rámec výjimky. Ukončete blok TRY END_CATCH makrem.
Pokud exception_class je třída CException
, budou zachyceny všechny typy výjimek. Pomocí členské funkce CObject::IsKindOf můžete určit, která konkrétní výjimka byla vyvolán. Lepší způsob zachycení několika druhů výjimek je použití sekvenčních příkazů AND_CATCH , z nichž každý má jiný typ výjimky.
Makro vytvoří ukazatel objektu výjimky. Nemusíte to deklarovat sami.
Poznámka:
Blok CATCH je definován jako obor C++ delineovaný složenými závorkami. Pokud deklarujete proměnné v tomto oboru, budou přístupné pouze v rámci tohoto oboru. To platí i pro exception_object_pointer_name.
Další informace o výjimkách a makreCH CATCH najdete v článku Výjimky.
Příklad
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
Definuje blok kódu, který zachytí všechny typy výjimek vyvolané v předchozím bloku TRY .
CATCH_ALL(exception_object_pointer_name)
Parametry
exception_object_pointer_name
Určuje název ukazatele objektu výjimky, který bude vytvořen makrem. Název ukazatele můžete použít pro přístup k objektu výjimky v CATCH_ALL
rámci bloku. Tato proměnná je pro vás deklarována.
Poznámky
Kód pro zpracování výjimek může v případě potřeby interrogovat objekt výjimky, aby získal další informace o konkrétní příčině výjimky. Vyvolání THROW_LAST
makra, které přesune zpracování na další vnější rámec výjimky. Pokud používáte CATCH_ALL, ukončete blok TRY END_CATCH_ALL makrem.
Poznámka:
Blok CATCH_ALL je definován jako obor jazyka C++ delineovaný složenými závorkami. Pokud deklarujete proměnné v tomto oboru, budou přístupné pouze v rámci tohoto oboru.
Další informace o výjimkách najdete v článku Výjimky.
Příklad
Podívejte se na příklad pro CFile::Abort.
Požadavky
Header afx.h
AND_CATCH
Definuje blok kódu pro zachycení dalších typů výjimek vyvolaných v předchozím bloku TRY .
AND_CATCH(exception_class, exception_object_pointer_name)
Parametry
exception_class
Určuje typ výjimky, pro který se má testovat. Seznamstandardních
exception_object_pointer_name
Název ukazatele objektu výjimky, který bude vytvořen makrem. Název ukazatele můžete použít pro přístup k objektu výjimky v rámci AND_CATCH bloku. Tato proměnná je pro vás deklarována.
Poznámky
Pomocí makra CATCH zachyťte jeden typ výjimky a potom AND_CATCH makro k zachycení každého dalšího typu. Ukončete blok TRY END_CATCH makrem.
Kód pro zpracování výjimek může v případě potřeby interrogovat objekt výjimky, aby získal další informace o konkrétní příčině výjimky. Voláním makra THROW_LAST v rámci bloku AND_CATCH přesunete zpracování na další vnější rámec výjimky. AND_CATCH označuje konec předchozího bloku CATCH nebo AND_CATCH.
Poznámka:
Blok AND_CATCH je definován jako obor C++ (definovaný složenými složenými závorkami). Pokud deklarujete proměnné v tomto oboru, mějte na paměti, že jsou přístupné pouze v rámci tohoto oboru. To platí také pro proměnnou exception_object_pointer_name .
Příklad
Podívejte se na příklad funkce CATCH.
Požadavky
Header afx.h
AND_CATCH_ALL
Definuje blok kódu pro zachycení dalších typů výjimek vyvolaných v předchozím bloku TRY .
AND_CATCH_ALL(exception_object_pointer_name)
Parametry
exception_object_pointer_name
Název ukazatele objektu výjimky, který bude vytvořen makrem. Název ukazatele můžete použít pro přístup k objektu výjimky v rámci AND_CATCH_ALL bloku. Tato proměnná je pro vás deklarována.
Poznámky
Pomocí makra CATCH zachyťte jeden typ výjimky a potom AND_CATCH_ALL makro k zachycení všech dalších typů. Pokud používáte AND_CATCH_ALL, ukončete blok TRY END_CATCH_ALL makrem.
Kód pro zpracování výjimek může v případě potřeby interrogovat objekt výjimky, aby získal další informace o konkrétní příčině výjimky. Voláním makra THROW_LAST v rámci bloku AND_CATCH_ALL se přesune zpracování na další vnější rámec výjimky. AND_CATCH_ALL označuje konec předchozího bloku CATCH nebo AND_CATCH_ALL.
Poznámka:
Blok AND_CATCH_ALL je definován jako obor C++ (definovaný složenými závorkami). Pokud deklarujete proměnné v tomto oboru, mějte na paměti, že jsou přístupné pouze v rámci tohoto oboru.
Požadavky
Header afx.h
END_CATCH
Označí konec posledního bloku CATCH nebo AND_CATCH .
END_CATCH
Poznámky
Další informace o makrech END_CATCH najdete v článku Výjimky.
Požadavky
Header afx.h
END_CATCH_ALL
Označí konec posledního CATCH_ALL88 nebo AND_CATCH_ALL bloku.
END_CATCH_ALL
Požadavky
Header afx.h
THROW (MFC)
Vyvolá zadanou výjimku.
THROW(exception_object_pointer)
Parametry
exception_object_pointer
Odkazuje na objekt výjimky odvozený z CException
.
Poznámky
THROW přeruší provádění programu a předá řízení přidruženému bloku CATCH v programu. Pokud jste nezadáli blok CATCH , předá se ovládací prvek modulu Knihovny tříd Microsoft Foundation, který vytiskne chybovou zprávu a ukončí.
Další informace najdete v článku Výjimky.
Požadavky
Header afx.h
THROW_LAST
Vyvolá výjimku zpět na další vnější blok CATCH .
THROW_LAST()
Poznámky
Toto makro umožňuje vyvolat místně vytvořenou výjimku. Pokud se pokusíte vyvolat výjimku, kterou jste právě zachytili, bude normálně mimo rozsah a bude odstraněna. Při THROW_LAST se výjimka předá správně další obslužné rutině CATCH .
Další informace najdete v článku Výjimky.
Příklad
Podívejte se na příklad pro CFile::Abort.
Požadavky
Header afx.h
AfxThrowArchiveException
Vyvolá výjimku archivu.
void AfxThrowArchiveException(int cause, LPCTSTR lpszArchiveName);
Parametry
Příčina
Určuje celé číslo, které označuje důvod výjimky. Seznam možných hodnot najdete v tématu CArchiveException::m_cause.
lpszArchiveName
Odkazuje na řetězec obsahující název objektu CArchive
, který způsobil výjimku (pokud je k dispozici).
Požadavky
Header afx.h
AfxThrowFileException
Vyvolá výjimku souboru.
void AfxThrowFileException(
int cause,
LONG lOsError = -1,
LPCTSTR lpszFileName = NULL);
Parametry
Příčina
Určuje celé číslo, které označuje důvod výjimky. Seznam možných hodnot naleznete v části CFileException::m_cause.
Chyba lOs
Obsahuje číslo chyby operačního systému (pokud je k dispozici), které uvádí důvod výjimky. Seznam kódů chyb najdete v příručce operačního systému.
lpszFileName
Odkazuje na řetězec obsahující název souboru, který způsobil výjimku (pokud je k dispozici).
Poznámky
Zodpovídáte za určení příčiny na základě kódu chyby operačního systému.
Požadavky
Header afx.h
AfxThrowInvalidArgException
Vyvolá výjimku neplatného argumentu.
Syntaxe
void AfxThrowInvalidArgException( );
Poznámky
Tato funkce se volá při použití neplatných argumentů.
Požadavky
Hlavička: afx.h
AfxThrowMemoryException
Vyvolá výjimku paměti.
void AfxThrowMemoryException();
Poznámky
Volání této funkce, pokud volání základní systémové paměti alokátory (například malloc a GlobalAlloc Windows funkce) selžou. Není nutné ji new
volat, protože new
vyvolá výjimku paměti automaticky, pokud přidělení paměti selže.
Požadavky
Header afx.h
AfxThrowNotSupportedException
Vyvolá výjimku, která je výsledkem požadavku na nepodporovanou funkci.
void AfxThrowNotSupportedException();
Požadavky
Header afx.h
AfxThrowResourceException
Vyvolá výjimku prostředku.
void AfxThrowResourceException();
Poznámky
Tato funkce se obvykle volá, když nelze načíst prostředek systému Windows.
Požadavky
Header afx.h
AfxThrowUserException
Vyvolá výjimku, která zastaví operaci koncového uživatele.
void AfxThrowUserException();
Poznámky
Tato funkce se obvykle volá okamžitě po AfxMessageBox
nahlášení chyby uživateli.
Požadavky
Header afx.h
AfxThrowOleDispatchException
Tato funkce slouží k vyvolání výjimky v rámci funkce automatizace OLE.
void AFXAPI AfxThrowOleDispatchException(
WORD wCode ,
LPCSTR lpszDescription,
UINT nHelpID = 0);
void AFXAPI AfxThrowOleDispatchException(
WORD wCode,
UINT nDescriptionID,
UINT nHelpID = -1);
Parametry
wCode
Kód chyby specifický pro vaši aplikaci.
lpszDescription
Slovní popis chyby.
nDescriptionID
ID zdroje pro slovní popis chyby.
nHelpID
Kontext nápovědy pro nápovědu vaší aplikace (. HLP) soubor.
Poznámky
Informace poskytované této funkci mohou být zobrazeny řídicí aplikací (Microsoft Visual Basic nebo jiná klientská aplikace OLE automatizace).
Příklad
// 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;
}
Požadavky
Header afx.h
AfxThrowOleException
Vytvoří objekt typu COleException
a vyvolá výjimku.
void AFXAPI AfxThrowOleException(SCODE sc);
void AFXAPI AfxThrowOleException(HRESULT hr);
Parametry
Sc
Stavový kód OLE, který označuje důvod výjimky.
Hr
Popisujte kód výsledku, který označuje důvod výjimky.
Poznámky
Verze, která přebírá HRESULT jako argument převede kód výsledku na odpovídající kód SCODE. Další informace o HRESULT a SCODE naleznete v tématu Struktura kódů chyb modelu COM v sadě Windows SDK.
Požadavky
Záhlaví afxdao.h
AfxThrowDaoException
Voláním této funkce vyvoláte výjimku typu CDaoException z vlastního kódu.
void AFXAPI AfxThrowDaoException(
int nAfxDaoError = NO_AFX_DAO_ERROR,
SCODE scode = S_OK);
Parametry
nAfxDaoError
Celočíselná hodnota představující kód rozšířené chyby DAO, který může být jednou z hodnot uvedených v seznamu CDaoException::m_nAfxDaoError.
scode
Kód chyby OLE z DAO typu SCODE. Informace naleznete v tématu CDaoException::m_scode.
Poznámky
Architektura také volá AfxThrowDaoException
. Ve volání můžete předat jeden z parametrů nebo obojího. Pokud například chcete vyvolat jednu z chyb definovaných v CDaoException::nAfxDaoError , ale nezajímáte parametr scode , předejte platný kód v parametru nAfxDaoError a přijměte výchozí hodnotu pro kód.
Informace o výjimkách souvisejících s třídami rozhraní MFC DAO naleznete CDaoException
v této knize a článek Výjimky: Výjimky databáze.
Požadavky
Header afxdb.h
AfxThrowDBException
Voláním této funkce vyvoláte výjimku typu z vlastního CDBException
kódu.
void AfxThrowDBException(
RETCODE nRetCode,
CDatabase* pdb,
HSTMT hstmt);
Parametry
nRetCode
Hodnota typu RETCODE definující typ chyby, která způsobila vyvolání výjimky.
pdb
Ukazatel na CDatabase
objekt, který představuje připojení zdroje dat, ke kterému je výjimka přidružena.
hstmt
Popisovač ODBC HSTMT, který určuje popisovač příkazu, ke kterému je výjimka přidružena.
Poznámky
Architektura volá AfxThrowDBException
, když obdrží ROZHRANÍ ODBC RETCODE z volání funkce rozhraní ODBC API a interpretuje RETCODE jako výjimečnou podmínku, nikoli očekávanou chybu. Operace přístupu k datům může například selhat kvůli chybě čtení disku.
Informace o hodnotách RETCODE definovaných rozhraním ODBC naleznete v kapitole 8"Načítání informací o stavu a chybě" v sadě Windows SDK. Informace o rozšíření mfc pro tyto kódy naleznete v tématu třídy CDBException.
Požadavky
Header afx.h
AfxAbort
Výchozí ukončovací funkce zadaná prostředím MFC.
void AfxAbort();
Poznámky
AfxAbort
je volána interně členské funkce MFC, pokud existuje závažná chyba, například nezachycená výjimka, kterou nelze zpracovat. Ve výjimečných případech můžete volat AfxAbort
, když dojde k závažné chybě, ze které se nemůžete zotavit.
Příklad
Podívejte se na příklad funkce CATCH.
Požadavky
Header afx.h
Viz také
Makra a globální objekty
CException – třída
CInvalidArgException – třída