Исключения. Преобразование из макроса исключений MFC
Это дополнительный раздел.
В этой статье описывается, как преобразовать существующий код, написанный с макросами Microsoft Foundation Class — TRY, CATCH, THROW и т. д. ), чтобы использовать ключевые слова try, catch и throw обработки исключений C++. Ниже приведен список разделов.
Преимущества преобразования
Преобразование код с макросами исключения для использования исключений C++.
Преимущества преобразования
Вероятно, не следует преобразовать существующий код, хотя необходимо знать различий между реализациями макроса в MFC версии 3.0 и в более ранних версиях реализациями. Эти различия и последующие изменения в расширении функциональности кода описаны в разделе Исключения: Изменения в макросы исключения в версии 3.0.
Основные преимущества преобразования:
Код, который использует ключевые слова обработки исключений C++ C компилируется в несколько более редко .EXE или DLL.
Ключевые слова обработки исключений C++ значительно превосходит C: Они могут обрабатывать исключения любого типа данных, которые можно скопировать (int, плавающееchar и т д), тогда как макросы обрабатывают исключения только класса CException и классов, производных от него.
Основное отличие между макросами и ключевыми словами, что код с помощью макроса «автоматически» удаляет перехваченное исключение при возникновении исключения выходит за пределы области действия. Код с помощью ключевого слова не найдено, поэтому необходимо явно удалять перехваченное исключение. Дополнительные сведения см. в статье Исключения: Улавливающ и удаление исключения.
Это различие синтаксис. Синтаксис для макросов и ключевых слов отличается в отношениях 3:
Аргументы макроса и объявления исключения:
Вызовом макроса CATCH имеет следующий синтаксис:
Exception_classCATCH(,**)**exception_object_pointer_name
Обратите внимание на запятую между именем класса и именем указателя объекта.
Объявление исключения для ключевого слова catch использует этот синтаксис:
)catch( exception_type exception_name
На этой оператора объявления исключения показан тип исключения дескрипторы блока catch.
Размежевывание блоков catch.
С помощью макросов, макрос CATCH () начинается с соответствующими аргументами первый блок catch; макрос AND_CATCH начинается последующие блоки catch, и макрос END_CATCH завершает последовательность блоков catch.
С ключевыми словами, ключевое слово catch (со своим объявления исключения) начинается каждый блок catch. Отсутствует эквивалент макросу END_CATCH; блок catch для выполнения со своей заключительной фигурной скобки.
Выражение хода:
Макросы используются повторно ход 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++.