Исключения: Преобразование из макросов исключения 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
Аргументы макроса и объявления исключения:
Вызов макроса CATCH имеет следующий синтаксис:
exception_classCATCH(, exception_object_pointer_name###)
Обратите внимание на запятую между именем класса и именем указателя объекта.
Объявление исключения для ключевого слова catch использует этот синтаксис:
exception_typeexception_name###)catch(
На этой выписку объявления исключения показан тип исключения маркеры блока catch.
Размежевывание блоков catch:
С макросами, макрос CATCH (с его аргументами), начинается первый блок catch. макрос AND_CATCH последующие блоки catch начинается и заканчивается макрос END_CATCH последовательности блоков catch.
С ключевыми словами, ключевое слово catch (с объявлением исключения), начинается каждый блок catch.Отсутствие аналогов к макросу END_CATCH; блок catch завершен со своей заключительной расчалкой.
Выражение штрихов:
Макросы используются re-ход THROW_LAST текущее исключение.Ключевое слово throw без аргумента, имеет тот же эффект.
Это преобразование
Преобразование кода с помощью макросов для использования ключевых слов обработки исключений C++
Найдите все вхождения макросов TRY, CATCH, AND_CATCH, END_CATCH, THROW и THROW_LAST MFC.
Замените или удалите все вхождения следующих макросов:
TRY (Замените его try)
CATCH (Замените его catch)
AND_CATCH (замените его catch)
END_CATCH (удалить)
THROW (Замените его throw)
THROW_LAST (замените его throw)
Измените аргументы макроса, чтобы они сформируют допустимые объявления исключения.
Например, изменение
CATCH(CException, e)
в
catch(CException* e)
Измените код в блоках 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++.