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