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


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

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

См. также

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

Обработка исключений в MFC