Отладка приложений

         

Обработка исключений средствами языка C++


Поскольку обработка исключений является частью спецификации языка C++, она, вероятно, больше знакома большинству программистов, чем SEH-обработка. Ключевые слова для организации обработки исключений в языке C++ — это try и catch. Ключевое слово throw позволяет начать раскрутку исключения. Тогда как коды ошибок SEH-обработчиков представлены одиночным целым числом без знака, оператор catch языка C++ может обрабатывать любой тип переменных, включая классы. Если вы выводите свои классы обработки ошибок из общего базового класса, то можете обрабатывать почти любую ошибку в своей программе. Именно этот иерархический подход к обработке ошибок применяется в библиотеке классов MFC (Microsoft Foundation Class) при работе с базовым классом CException. В листинге 9-3 показана обработка исключений C++ при чтении заголовка файла MFC-класса CFiie.

Листинг 9-3.Пример обработчика исключений язака С++

BOOL ReadFileHeader ( CFile * pFile, LPHEADERINFO pHeader) 

{

ASSERT ( FALSE == IsBadReadPtr ( pFile, sizeof ( CFile *))); 

ASSERT ( FALSE == IsBadReadPtr ( pHeader,

sizeof ( LPHEADERINFO)) ) ;

if ( ( TRUE == IsBadReadPtr ( pFile, sizeof ( CFile *))) ||

 ( TRUE = IsBadReadPtr ( pHeader,

Sizeof ( LPHEADERINFO) )) ) 

{

return ( FALSE) ; 

}

BOOL bRet;

try ;

{

pFile->Read ( pHeader, sizeof ( HEADERINFO));

 bRet = TRUE; 

}

catch ( CFileException * e) 

{

// Если заголовок не может быть прочитан из-за того, что он был

// усечен, то обработать исключение; иначе — продолжить раскрутку, 

if ( CFileException:rendOfFile == e->m_cause) 

{

e->Delete(); bRet = false;

}

else {

// Оператор throw выбрасывет исключение, которое

 // передается в этот catch-блок.

throw; 

}

return ( bRet); 

}

При использовании обработки исключений языка C++ нужно иметь в виду следующие ее недостатки. Во-первых, аварии приложений не обрабатываются автоматически. (Позже мы рассмотрим работу с этим ограничением.) Во-вторых, обработка исключений в C++ не бесплатна. Компилятор может выполнять большую работу, устанавливая и удаляя блоки try и catch, даже если вы никогда не возбуждаете никаких исключений, так что если ваш код чувствителен к производительности, вы не можете позволить себе такие большие издержки. Хотя эти случаи редки, но они происходят. Если вы плохо знакомы с обработкой исключений в C++, то MSDN — самое подходящее место, чтобы начать ее изучение.



Содержание раздела