Программирование на языке 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. Невооруженным взглядом видно, что метод обязатель­но должен быть переопределен. Дело в том, что метод просто-на­просто обнуляет все переданные ему значения.

Похожие статьи: