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