Поделиться через


Исключения. Перехват и удаление исключений

В следующих инструкциях и примерах показано, как перехватывать и удалять исключения. Дополнительные сведения о tryфункциях и catchthrow ключевое слово см. в рекомендациях по использованию современных C++ для исключений и обработки ошибок.

Обработчики исключений должны удалять объекты исключений, которые они обрабатывают, так как сбой удаления исключения приводит к утечке памяти всякий раз, когда этот код перехватывает исключение.

Блок catch должен удалить исключение, если:

  • Блок catch создает новое исключение.

    Конечно, при повторном вызове того же исключения не следует удалять:

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • Выполнение возвращается из catch блока.

Примечание.

При удалении CExceptionэлемента используйте Delete функцию-член для удаления исключения. Не используйте delete ключевое слово, так как это может завершиться ошибкой, если исключение не находится в куче.

Перехват и удаление исключений

  1. try Используйте ключевое слово для настройки try блока. Выполните любые инструкции программы, которые могут вызвать исключение в блоке try .

    catch Используйте ключевое слово для настройки catch блока. Поместите код обработки исключений catch в блок. Код в блоке выполняется только в том случае, если код в catchtry блоке создает исключение типа, указанного в инструкции 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".

См. также

Обработка исключений