

Программирование на языке MFC
Мой второй блог в серии программирования
Класс CException
Библиотека MFC предоставляет программисту набор классов для обработки исключительных ситуаций. Базовым для классов
обработки исключений является класс CException. Помимо этого, от него унаследованы несколько классов, предназначенных для обработки исключений разных типов. Список классов для обработки исключений приведен в табл. 7.
Для того чтобы выработать исключение, можно использовать оператор throw, но тогда нам пришлось бы самим заботиться об аргументах этого оператора. Для того чтобы облегчить выработку исключения, в MFC используются несколько функций, специально предназначенных для выработки исключений. В табл. 8 приведен список этих функций.
Рассмотрение классов исключений мы начнем с базового класса CException. В файле afx.h этот класс описан следующим образом:
#ifdef _AFXDLL
class CException : public CObject #else
class AFX_NOVTABLE CException : public CObject
#endif
{
// abstract class for dynamic type checking DECLARE_DYNAMIC(CException) public:
11 Constructors
CException(); // sets m_bAutoDelete = TRUE CException(BOOL bAutoDelete); // sets m_bAutoDelete =
// bAutoDelete
// Operations
void Delete(); // use to delete exception in // ‘catch’ block
virtual BOOL GetErrorMessage(LPTSTR IpszError,
UINT nMaxError, PUINT pnHelpContext = NULL); virtual int ReportError(UINT nType = MB_OK,
UINT nMessagelD = 0);
// Implementation (setting m_bAutoDelete to FALSE // is advanced) public:
virtual -CException();
BOOL m_bAutoDelete; #ifdef _DEBUG
void PASCAL operator delete(void* pbData); #if _MSC_VER >= 1200
void PASCAL operator delete(void* pbData,
LPCSTR IpszFileName, int nLine);
#endif
protected:
BOOL m_bReadyForDelete; #endif };
Исходный код конструктора по умолчанию этого объекта находится в файле except.cpp:
CException::CException() {
// most exceptions are deleted when not needed
m_bAutoDelete = TRUE; #ifdef _DEBUG
m_bReadyForDelete = FALSE; #endif }
Этот конструктор не делает ничего, кроме того, что присваивает полю m_bAutoDelete значение TRUE. Это означает, что в том случае, когда надобность в объекте отпадет, он будет удален автоматически.
Однако, у объекта есть и второй конструктор. Исходный код его приведен ниже:
CException::CException(BOOL bAutoDelete)
{
// for exceptions which are not auto-delete (usually)
m_bAutoDelete = bAutoDelete; #ifdef _DEBUG
m_bReadyForDelete = FALSE; #endif }
В качестве аргумента конструктору передается желаемое значение поля m_bAutoDelete. От предыдущего этот конструктор практически не отличается.
Исходный текст метода GetErrorMessage() приведен ниже:
BOOL CException::GetErrorMessage(LPTSTR IpszError,
UINT nMaxError, PUINT pnHelpContext /* = NULL */ )
{
if (pnHelpContext != NULL) *pnHelpContext = 0;
if (nMaxError != 0 && IpszError != NULL) *lpszError = Л0′ ;
return FALSE;
}
Методу в качестве первого аргумента передается указатель на буфер, в который будет записана строка, содержащая информацию об ошибке. Второй аргумент – это длина буфера. Аргумент третий – указатель на идентификатор помощи, по умолчанию равный NULL. Невооруженным взглядом видно, что метод обязательно должен быть переопределен. Дело в том, что метод просто-напросто обнуляет все переданные ему значения.
Похожие статьи: Класс CException
