Sdílet prostřednictvím


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 CDaoExceptiona 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