Обработка исключений средствами языка 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 — самое подходящее место, чтобы начать ее изучение.