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ą CException
klasę 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
, , try
THROW_LAST
, catch
, and_catch
i 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 CException
utworzona 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
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 CException
i 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();
}