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


Исключения. Преобразование из макроса исключений MFC

Это дополнительный раздел.

В этой статье описывается, как преобразовать существующий код, написанный с макросами Microsoft Foundation Class — TRY, CATCH, THROW и т. д. ), чтобы использовать ключевые слова try, catch и throw обработки исключений C++. Ниже приведен список разделов.

  • Преимущества преобразования

  • Преобразование код с макросами исключения для использования исключений C++.

Преимущества преобразования

Вероятно, не следует преобразовать существующий код, хотя необходимо знать различий между реализациями макроса в MFC версии 3.0 и в более ранних версиях реализациями. Эти различия и последующие изменения в расширении функциональности кода описаны в разделе Исключения: Изменения в макросы исключения в версии 3.0.

Основные преимущества преобразования:

  • Код, который использует ключевые слова обработки исключений C++ C компилируется в несколько более редко .EXE или DLL.

  • Ключевые слова обработки исключений C++ значительно превосходит C: Они могут обрабатывать исключения любого типа данных, которые можно скопировать (int, плавающееchar и т д), тогда как макросы обрабатывают исключения только класса CException и классов, производных от него.

Основное отличие между макросами и ключевыми словами, что код с помощью макроса «автоматически» удаляет перехваченное исключение при возникновении исключения выходит за пределы области действия. Код с помощью ключевого слова не найдено, поэтому необходимо явно удалять перехваченное исключение. Дополнительные сведения см. в статье Исключения: Улавливающ и удаление исключения.

Это различие синтаксис. Синтаксис для макросов и ключевых слов отличается в отношениях 3:

  1. Аргументы макроса и объявления исключения:

    Вызовом макроса CATCH имеет следующий синтаксис:

    Exception_classCATCH(,**)**exception_object_pointer_name

    Обратите внимание на запятую между именем класса и именем указателя объекта.

    Объявление исключения для ключевого слова catch использует этот синтаксис:

    )catch( exception_type exception_name

    На этой оператора объявления исключения показан тип исключения дескрипторы блока catch.

  2. Размежевывание блоков catch.

    С помощью макросов, макрос CATCH () начинается с соответствующими аргументами первый блок catch; макрос AND_CATCH начинается последующие блоки catch, и макрос END_CATCH завершает последовательность блоков catch.

    С ключевыми словами, ключевое слово catch (со своим объявления исключения) начинается каждый блок catch. Отсутствует эквивалент макросу END_CATCH; блок catch для выполнения со своей заключительной фигурной скобки.

  3. Выражение хода:

    Макросы используются повторно ход THROW_LAST текущее исключение. Ключевое слово throw, без аргументов, приводит к тому же результату.

Это преобразование

Преобразование кода с помощью макросов для использования ключевых слов обработки исключений C++.

  1. Найдите все вхождения макросов TRY, CATCH, AND_CATCH, END_CATCH, THROW и THROW_LAST MFC.

  2. Удалите или замените все вхождения следующих макросов.

    Замените его с TRY ( try)

    Замените его с CATCH ( catch)

    замените его с AND_CATCH ( catch)

    END_CATCH (удалить его)

    THROW (Замените его с throw)

    THROW_LAST (замените его с throw)

  3. Изменяет аргументы макроса, чтобы они объявления исключения допустимые формы.

    Например, изменение

    CATCH(CException, e)
    

    в

    catch(CException* e)
    
  4. Измените код в блоках catch таким образом, чтобы он удаляет объекты исключения по мере необходимости. Дополнительные сведения см. в статье Исключения: Улавливающ и удаление исключения.

Ниже приведен пример кода обработки исключений с помощью макросов MFC исключения. Обратите внимание, что поскольку код в следующем примере используется макрос, исключение e удаляется автоматически.

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   if (m_bPassExceptionsUp)
      THROW_LAST();

   if (m_bReturnFromThisFunction)
      return;

   // Not necessary to delete the exception e.
}
END_CATCH

Код в следующем примере используются ключевые слова исключения C++, поэтому необходимо явно удалять исключение:

try
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
catch(CException* e)
{
   if (m_bPassExceptionsUp)
      throw;

   if (m_bThrowDifferentException)
   {
      e->Delete();
      throw new CMyOtherException;
   }

   if (m_bReturnFromThisFunction)
   {
      e->Delete();
      return;
   }

   e->Delete();
}

Дополнительные сведения см. в разделе Исключения: С помощью макросов MFC исключения C++.

См. также

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

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