Исключения: С помощью макросов MFC и исключений C++
В данной статье рассматриваются вопросы написать код, использующий и макросы обработки ошибок MFC и ключевые слова обработки исключений C++.
Данный раздел содержит следующие подразделы.
Смешивание ключевые слова и макросы исключения
Блоки catch внутри блоков try
Смешивание ключевые слова и макросы исключения
Можно ограниченным образом объединить ключевые слова макросов исключения MFC и исключений C++ в одной программе.Однако нельзя смешивать макросов MFC с ключевыми словами исключений C++ в одном блоке, поскольку макросы удаляют объекты исключений автоматически, когда они идут из области, тогда как код с помощью ключевых слов обработки ошибок нет.Дополнительные сведения см. в статье исключения: Улавливающ и удаление исключения.
Основное различие между макросами и ключевыми словами, что макросы «автоматически» удаления обнаружено исключение, когда исключение покидает область.Код с использованием ключевые слова не делает. исключения, перехваченные в блоке catch должна быть явно удалена.Смешивание макросы и исключение C++ ключевые слова могут вызвать утечку памяти, когда объект исключения не удален или повреждение кучи, когда исключение удаленные дважды.
Например, следующий код объявляет указатель исключения:
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
throw; // Invalid attempt to throw exception
// to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is invalid because
// it was deleted in the inner catch block.
}
END_CATCH
Проблема происходит, поскольку e удаляется, когда выполнение «внутреннего блока CATCH ».Использование макроса вместо THROW_LAST выписки THROW вызовет «внешний» блок CATCH получить допустимый указатель.
TRY
{
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e) // The "inner" catch block
{
THROW_LAST(); // Throw exception to the outer catch block below.
}
END_CATCH
}
CATCH(CException, e) // The "outer" catch block
{
// Pointer e is valid because
// THROW_LAST() was used.
}
END_CATCH
Блоки catch внутри блоков try
Нельзя re-ход текущее исключение внутри блока try внутри блока CATCH.Следующий пример является недопустимым.
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
try
{
throw; // Wrong. Causes e (the exception
// being thrown) to be deleted.
}
catch(CException* exception)
{
exception->ReportError();
}
}
END_CATCH
Дополнительные сведения см. в разделе исключения: При просмотре содержимое исключения.