Sdílet prostřednictvím


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í CExceptiontří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 THROWmakry , , THROW_LASTtry, catch, and_catcha 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 CExceptionCObject::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 ReportErrordvěma členskými funkcemi, které pracují s některou z CExceptionodvozený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

Objekt CObject

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++- trycatch. Pokud používáte makra TRY MFC a CATCHtato 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();
}

Viz také

CObject Třída
Graf hierarchie
Zpracování výjimek