Поделиться через


Исключения: С помощью макросов 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

Дополнительные сведения см. в разделе исключения: При просмотре содержимое исключения.

См. также

Основные понятия

Обработка ошибок в MFC