MFC (и обработка исключений макросы) предшествуют спецификации языка C ++ 98.Макросы пытаются абстрагировать общий шаблонный код при использовании исключений в MFC.Стандартный код необходим из-за проектного решения, что исключения в MFC динамически распределяются 1 , и их необходимо удалять вручную.
Шаги, необходимые для замены макросов обработки исключений MFC наОбработка исключений в C ++ описана в разделе Исключения: преобразование из макросов исключений MFC :
Для преобразования кода с использованием макросов в ключевые слова обработки исключений C ++
Найдите все вхождения макросов MFC TRY
, CATCH
, AND_CATCH
, END_CATCH
, THROW
и THROW_LAST
.
Заменить илиудалить все вхождения следующих макросов:
TRY
(заменить на try
) CATCH
(заменить на catch
) AND_CATCH
(заменить на catch
) END_CATCH
(удалить) THROW
(заменить на throw
) THROW_LAST
(Замените его на throw
)
Измените аргументы макроса так, чтобы они формировали допустимые объявления исключений.
Например, измените
CATCH(CException, e)
на
catch(CException* e)
Измените код в блоках перехвата так, чтобы он удалял объекты исключений какнеобходимо.Для получения дополнительной информации см. Статью Исключения: перехват и удаление исключений .
Вот пример кода обработки исключений с использованием макросов исключений 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) ссылке.