CException
Třída
Základní třída pro všechny výjimky v knihovně tříd Microsoft Foundation.
Syntaxe
class AFX_NOVTABLE CException : public CObject
Členové
Veřejné konstruktory
Název | Popis |
---|---|
CException::CException |
CException Vytvoří objekt. |
Veřejné metody
Název | Popis |
---|---|
CException::Delete |
Odstraní CException objekt. |
CException::ReportError |
Nahlásí uživateli chybovou zprávu v poli se zprávou. |
Poznámky
Protože CException
je abstraktní základní třída, nemůžete vytvářet CException
objekty přímo; je nutné vytvořit objekty odvozených tříd. Pokud potřebujete vytvořit vlastní CException
třídu -style, použijte jednu z odvozených tříd uvedených výše jako model. Ujistěte se, že vaše odvozená třída také používá IMPLEMENT_DYNAMIC
.
Odvozené třídy a jejich popisy jsou uvedeny níže:
Název | Popis |
---|---|
CSimpleException |
Základní třída pro výjimky mfc kritické pro prostředky |
CInvalidArgException |
Neplatná podmínka výjimky argumentu |
CMemoryException |
Výjimka z nedostatku paměti |
CNotSupportedException |
Žádost o nepodporovanou operaci |
CArchiveException |
Výjimka specifická pro archivaci |
CFileException |
Výjimka specifická pro soubor |
CResourceException |
Prostředek Windows se nenašel nebo nejde creatable |
COleException |
Výjimka OLE |
CDBException |
Výjimka databáze (to znamená podmínky výjimky vyplývající z databázových tříd MFC na základě připojení open database) |
COleDispatchException |
Výjimka pro odesílání OLE (automatizace) |
CUserException |
Výjimka, která značí, že se nepodařilo najít prostředek |
CDaoException |
Výjimka objektu přístupu k datům (to znamená podmínky výjimky vyplývající z tříd DAO) |
CInternetException |
Výjimka z internetu (to znamená podmínky výjimky vyplývající z internetových tříd). |
Tyto výjimky jsou určeny k použití s THROW
makry , , THROW_LAST
try
, catch
, and_catch
a end_catch
makry. Další informace o výjimkách naleznete v tématu Zpracování výjimek nebo v článku Zpracování výjimek (MFC).
Chcete-li zachytit konkrétní výjimku, použijte příslušnou odvozenou třídu. Chcete-li zachytit všechny typyvýjimekch CException
CObject::IsKindOf
CException
Mějte na paměti, že CObject::IsKindOf
funguje pouze pro třídy deklarované s IMPLEMENT_DYNAMIC
makrem, aby bylo možné využít dynamické kontroly typů. Každou CException
-odvozenou třídu, kterou vytvoříte, by měla také použít IMPLEMENT_DYNAMIC
makro.
Podrobnosti o výjimkách uživatele můžete hlásit voláním GetErrorMessage
nebo ReportError
dvěma členskými funkcemi, které pracují s některou z CException
odvozených tříd.
Pokud je výjimka zachycena jedním z maker, CException
objekt se odstraní automaticky. Neodstraňujte ho sami. Pokud se výjimka chytí pomocí klíčového catch
slova, neodstraní se automaticky. Další informace o tom, kdy odstranit objekt výjimky, najdete v článku Zpracování výjimek (MFC ).
Hierarchie dědičnosti
CException
Požadavky
Záhlaví: afx.h
CException::CException
Tato členová funkce vytvoří CException
objekt.
explicit CException(BOOL bAutoDelete);
Parametry
b_AutoDelete
Určete TRUE
, zda byla v haldě přidělena paměť objektu CException
. To způsobí odstranění objektu CException
Delete
při zavolání členské funkce k odstranění výjimky. Určete FALSE
, zda CException
je objekt v zásobníku nebo je globálním objektem. V tomto případě CException
se objekt při zavolání členské funkce neodstraní Delete
.
Poznámky
Obvykle byste tento konstruktor nemuseli volat přímo. Funkce, která vyvolá výjimku, by měla vytvořit instanci CException
-odvozené třídy a volat její konstruktor, nebo by měla použít některou z funkcí vyvolání předdefinovaného typu knihovny MFC.AfxThrowFileException
Tato dokumentace je poskytována pouze pro úplnost.
CException::Delete
Tato funkce zkontroluje, jestli CException
byl objekt vytvořen v haldě, a pokud ano, volá delete
operátor objektu.
void Delete();
Poznámky
Při odstraňování objektu CException
Delete
odstraňte výjimku pomocí členské funkce. Operátor nepoužívejte delete
přímo, protože CException
objekt může být globální objekt nebo byl vytvořen v zásobníku.
Můžete určit, zda má být objekt odstraněn při vytváření objektu. Další informace najdete na webu CException::CException
.
Volání stačí Delete
jenom v případě, že používáte mechanismus C++- try
catch
. Pokud používáte makra TRY
MFC a CATCH
tato makra budou automaticky volat tuto funkci.
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.
// Note that this example performs the same actions as the
// example for CATCH, but uses C++ try/catch syntax instead
// of using the MFC TRY/CATCH macros. This sample must use
// CException::Delete() to delete the exception objects
// before closing the catch block, while the CATCH example
// implicitly performs the deletion via the macros.
try
{
pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG ullLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %u bytes long."), ullLength);
AfxMessageBox(str);
}
catch(CFileException* pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
pEx->Delete();
}
catch(CMemoryException* pEx)
{
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally, an
// an application should do everything it possibly can to
// clean up properly and _not_ call AfxAbort().
pEx->Delete();
AfxAbort();
}
// 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 clean-up code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
CException::ReportError
Voláním této členské funkce můžete uživateli oznámit text chyby v poli se zprávou.
virtual int ReportError(
UINT nType = MB_OK,
UINT nMessageID = 0);
Parametry
nType
Určuje styl pole zprávy. U pole použijte libovolnou kombinaci stylů pole se zprávou . Pokud tento parametr nezadáte, výchozí hodnota je MB_OK
.
nMessageID
Určuje ID prostředku (položku tabulky řetězců) zprávy, která se má zobrazit, pokud objekt výjimky nemá chybovou zprávu. Pokud 0, zobrazí se zpráva "Není k dispozici žádná chybová zpráva".
Návratová hodnota
Hodnota AfxMessageBox
, jinak 0, pokud není dostatek paměti pro zobrazení pole se zprávou. Podívejte AfxMessageBox
se na možné návratové hodnoty.
Příklad
Tady je příklad použití .CException::ReportError
Další příklad najdete v příkladu .CATCH
CFile fileInput;
CFileException ex;
// try to open a file for reading.
// The file will certainly not
// exist because there are too many explicit
// directories in the name.
// if the call to Open() fails, ex will be
// initialized with exception
// information. the call to ex.ReportError() will
// display an appropriate
// error message to the user, such as
// "\Too\Many\Bad\Dirs.DAT contains an
// invalid path." The error message text will be
// appropriate for the
// file name and error condition.
if (!fileInput.Open(_T("\\Too\\Many\\Bad\\Dirs.DAT"), CFile::modeRead, &ex))
{
ex.ReportError();
}
else
{
// the file was opened, so do whatever work
// with fileInput we were planning...
fileInput.Close();
}