Исключения. Перехват и удаление исключений
В следующих инструкциях и примерах показано, как перехватывать и удалять исключения. Дополнительные сведения о try
функциях и catch
throw
ключевое слово см. в рекомендациях по использованию современных C++ для исключений и обработки ошибок.
Обработчики исключений должны удалять объекты исключений, которые они обрабатывают, так как сбой удаления исключения приводит к утечке памяти всякий раз, когда этот код перехватывает исключение.
Блок catch
должен удалить исключение, если:
Блок
catch
создает новое исключение.Конечно, при повторном вызове того же исключения не следует удалять:
catch (CException* e) { if (m_bThrowExceptionAgain) throw; // Do not delete e else e->Delete(); }
Выполнение возвращается из
catch
блока.
Примечание.
При удалении CException
элемента используйте Delete
функцию-член для удаления исключения. Не используйте delete
ключевое слово, так как это может завершиться ошибкой, если исключение не находится в куче.
Перехват и удаление исключений
try
Используйте ключевое слово для настройкиtry
блока. Выполните любые инструкции программы, которые могут вызвать исключение в блокеtry
.catch
Используйте ключевое слово для настройкиcatch
блока. Поместите код обработки исключенийcatch
в блок. Код в блоке выполняется только в том случае, если код вcatch
try
блоке создает исключение типа, указанного в инструкцииcatch
.В следующем скелете показано, как
try
иcatch
блоки обычно упорядочены:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CException* e) { // Handle the exception here. // "e" contains information about the exception. e->Delete(); }
При возникновении исключения элемент управления передается первому
catch
блоку, объявление исключения которого соответствует типу исключения. Вы можете выборочно обрабатывать различные типы исключений с последовательнымиcatch
блоками, как показано ниже:try { // Execute some code that might throw an exception. AfxThrowUserException(); } catch (CMemoryException* e) { // Handle the out-of-memory exception here. e->Delete(); } catch (CFileException* e) { // Handle the file exceptions here. e->Delete(); } catch (CException* e) { // Handle all other types of exceptions here. e->Delete(); }
Дополнительные сведения см. в разделе "Исключения: преобразование из макросов исключений MFC".