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


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

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

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

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

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

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

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

Примечание

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

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

  • Используйте ключевое слово 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.

См. также

Основные понятия

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