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


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

Это расширенный раздел.

В этой статье объясняется, как преобразовать существующий код, написанный с помощью макросов класса Microsoft Foundation — TRY, CATCH, THROW и т. д. для использования ключевое слово catchtryобработки исключений C++ и throwт. д. Разделы включают:

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

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

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

  • Код, использующий обработку исключений C++, ключевое слово компилируется в немного меньший ФАЙЛ .EXE или DLL.

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

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

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

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

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

    CATCH(exception_class, exception_object_pointer_name)

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

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

    catch(exception_type exception_name)

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

  2. Разделитель блоков catch:

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

    С ключевое слово catch начинается каждый блок перехвата ключевое слово (с объявлением исключения). Нет аналога макроса END_CATCH ; блок catch заканчивается закрывающей скобкой.

  3. Выражение броска:

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

Выполнение преобразования

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

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

  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++".

См. также

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