В чем разница между try / catch и MFC TRY / CATCH? - PullRequest
0 голосов
/ 26 октября 2018

Я рефакторинг некоторого устаревшего кода C ++ MFC и наткнулся на эту конструкцию:

TRY
{
    // do some stuff
}
CATCH
{
    // do some other stuff
}
END_CATCH

Мне это кажется довольно необычным, и я пытаюсь понять, в чем выгода от использования TRY/CATCH в пользу try/catch.

Я вижу, что TRY создает экземпляр AFX_EXCEPTION_LINK, и я не совсем понимаю цель этого. Мой навык поиска в Google с треском провалился.

1 Ответ

0 голосов
/ 26 октября 2018

MFC (и обработка исключений макросы) предшествуют спецификации языка C ++ 98.Макросы пытаются абстрагировать общий шаблонный код при использовании исключений в MFC.Стандартный код необходим из-за проектного решения, что исключения в MFC динамически распределяются 1 , и их необходимо удалять вручную.

Шаги, необходимые для замены макросов обработки исключений MFC наОбработка исключений в C ++ описана в разделе Исключения: преобразование из макросов исключений MFC :

Для преобразования кода с использованием макросов в ключевые слова обработки исключений 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. Измените код в блоках перехвата так, чтобы он удалял объекты исключений какнеобходимо.Для получения дополнительной информации см. Статью Исключения: перехват и удаление исключений .

Вот пример кода обработки исключений с использованием макросов исключений 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, вызывая CException :: Delete .


1 В отличие от сегодняшнего соглашения об обработке исключений C ++: бросок по значению, отлов по (const) ссылке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...