Udostępnij za pośrednictwem


CException Klasa

Klasa podstawowa dla wszystkich wyjątków w bibliotece klas programu Microsoft Foundation.

Składnia

class AFX_NOVTABLE CException : public CObject

Elementy członkowskie

Konstruktory publiczne

Nazwa/nazwisko opis
CException::CException CException Tworzy obiekt.

Metody publiczne

Nazwa/nazwisko opis
CException::Delete Usuwa CException obiekt.
CException::ReportError Zgłasza komunikat o błędzie w polu komunikatu do użytkownika.

Uwagi

Ponieważ CException jest abstrakcyjną klasą bazową, nie można bezpośrednio tworzyć CException obiektów; należy utworzyć obiekty klas pochodnych. Jeśli musisz utworzyć własną CExceptionklasę stylu, użyj jednej z klas pochodnych wymienionych powyżej jako modelu. Upewnij się, że klasa pochodna używa również klasy IMPLEMENT_DYNAMIC.

Klasy pochodne i ich opisy są wymienione poniżej:

Nazwa/nazwisko opis
CSimpleException Klasa podstawowa dla wyjątków MFC o krytycznym znaczeniu dla zasobów
CInvalidArgException Nieprawidłowy warunek wyjątku argumentu
CMemoryException Wyjątek braku pamięci
CNotSupportedException Żądanie nieobsługiwanej operacji
CArchiveException Wyjątek specyficzny dla archiwum
CFileException Wyjątek specyficzny dla pliku
CResourceException Nie można odnaleźć zasobu systemu Windows lub nie można go znaleziono
COleException Wyjątek OLE
CDBException Wyjątek bazy danych (czyli warunki wyjątku wynikające z klas baz danych MFC oparte na łączności z otwartą bazą danych)
COleDispatchException Wyjątek wysyłania OLE (automatyzacja)
CUserException Wyjątek wskazujący, że nie można odnaleźć zasobu
CDaoException Wyjątek obiektu dostępu do danych (czyli warunki wyjątku wynikające z klas DAO)
CInternetException Wyjątek internetowy (czyli warunki wyjątku wynikające z klas internetowych).

Te wyjątki mają być używane z makrami THROW, , tryTHROW_LAST, catch, and_catchi end_catch . Aby uzyskać więcej informacji na temat wyjątków, zobacz Przetwarzanie wyjątków lub zobacz artykuł Obsługa wyjątków (MFC).

Aby przechwycić określony wyjątek, użyj odpowiedniej klasy pochodnej. Aby przechwycić wszystkie typy wyjątków, użyj polecenia CException, a następnie użyj polecenia CObject::IsKindOf , aby rozróżnić klasy pochodne.CException Należy pamiętać, że CObject::IsKindOf działa tylko w przypadku klas zadeklarowanych za IMPLEMENT_DYNAMIC pomocą makra, aby móc korzystać z dynamicznego sprawdzania typów. Każda CExceptionutworzona klasa pochodna powinna również używać makra IMPLEMENT_DYNAMIC .

Szczegółowe informacje o wyjątkach od użytkownika można zgłaszać, wywołując lub GetErrorMessage ReportError, dwie funkcje składowe, które działają z dowolną z klas pochodnych CException.

Jeśli wyjątek zostanie przechwycony przez jedno z makr, CException obiekt zostanie usunięty automatycznie; nie usuwaj go samodzielnie. Jeśli wyjątek zostanie przechwycony przy użyciu słowa kluczowego catch , nie zostanie on automatycznie usunięty. Zobacz artykuł Obsługa wyjątków (MFC), aby uzyskać więcej informacji o tym, kiedy usunąć obiekt wyjątku.

Hierarchia dziedziczenia

Obiekt CObject

CException

Wymagania

Nagłówek: afx.h

CException::CException

Ta funkcja składowa konstruuje CException obiekt.

explicit CException(BOOL bAutoDelete);

Parametry

b_AutoDelete
Określ TRUE , czy pamięć dla CException obiektu została przydzielona na stercie. CException Spowoduje to usunięcie obiektu po wywołaniu funkcji składowej w Delete celu usunięcia wyjątku. Określ FALSE , czy CException obiekt znajduje się na stosie, czy jest obiektem globalnym. W takim przypadku CException obiekt nie zostanie usunięty po wywołaniu funkcji składowej Delete .

Uwagi

Zwykle nigdy nie trzeba wywoływać tego konstruktora bezpośrednio. Funkcja, która zgłasza wyjątek, powinna utworzyć wystąpienie klasy pochodnej CExceptioni wywołać jego konstruktor lub użyć jednej z funkcji throw MFC, takich jak AfxThrowFileException, w celu wyrzucenia wstępnie zdefiniowanego typu. Ta dokumentacja jest udostępniana tylko na potrzeby kompletności.

CException::Delete

Ta funkcja sprawdza, czy CException obiekt został utworzony na stercie, a jeśli tak, wywołuje delete operator w obiekcie.

void Delete();

Uwagi

Podczas usuwania CException obiektu użyj funkcji składowej Delete , aby usunąć wyjątek. Nie używaj delete operatora bezpośrednio, ponieważ CException obiekt może być obiektem globalnym lub został utworzony na stosie.

Można określić, czy obiekt ma zostać usunięty podczas konstruowania obiektu. Aby uzyskać więcej informacji, zobacz CException::CException.

Wystarczy wywołać Delete metodę , jeśli używasz mechanizmu języka C++ try- catch . Jeśli używasz makr TRY MFC i CATCH, te makra automatycznie wywołają tę funkcję.

Przykład

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

Wywołaj tę funkcję składową, aby zgłosić tekst błędu w polu komunikatu użytkownikowi.

virtual int ReportError(
    UINT nType = MB_OK,
    UINT nMessageID = 0);

Parametry

nType
Określa styl okna komunikatu. Zastosuj dowolną kombinację stylów okna komunikatów do pola. Jeśli nie określisz tego parametru, wartość domyślna to MB_OK.

nMessageID
Określa identyfikator zasobu (wpis tabeli ciągów) komunikatu do wyświetlenia, jeśli obiekt wyjątku nie ma komunikatu o błędzie. Jeśli 0, zostanie wyświetlony komunikat "Komunikat o błędzie nie jest dostępny".

Wartość zwracana

Wartość AfxMessageBox ; w przeciwnym razie 0, jeśli nie ma wystarczającej ilości pamięci, aby wyświetlić okno komunikatu. Zobacz AfxMessageBox , aby uzyskać możliwe wartości zwracane.

Przykład

Oto przykład użycia elementu CException::ReportError. Aby zapoznać się z innym przykładem, zobacz przykład dla 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();
}

Zobacz też

CObject Klasa
Wykres hierarchii
Przetwarzanie wyjątków