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


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

Это дополнительный шаг.

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

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

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

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

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

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

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

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

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

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

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

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

    exception_classCATCH(, exception_object_pointer_name###)

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

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

    exception_typeexception_name###)catch(

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

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

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

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

  3. Выражение штрихов:

    Макросы используются re-ход 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