Compartilhar via


Exceções: obtendo e excluindo exceções

As instruções e os exemplos a seguir mostram como capturar e excluir exceções. Para obter mais informações sobre as palavras-chave try, catch e throw, consulte Melhores práticas do C++ moderno para tratamento de erros e exceções.

Os manipuladores de exceção devem excluir objetos de exceção que eles manipulam, pois a falha ao excluir a exceção causa um vazamento de memória sempre que esse código captura uma exceção.

Seu bloco catch deve excluir uma exceção quando:

  • O bloco catch gera uma nova exceção.

    É claro que você não deve excluir a exceção se lançar a mesma exceção novamente:

    catch (CException* e)
    {
       if (m_bThrowExceptionAgain)
          throw; // Do not delete e
       else
          e->Delete();
    }
    
  • A execução retorna de dentro do bloco catch.

Observação

Ao excluir um CException, use a função membro Delete para excluir a exceção. Não use a palavra-chave delete, pois ela poderá falhar se a exceção não estiver no heap.

Adicionar e excluir exceções

  1. Use a palavra-chave try para configurar um bloco try. Execute qualquer instrução de programa que possa gerar uma exceção dentro de um bloco try.

    Use a palavra-chave catch para configurar um bloco catch. Coloque o código de tratamento de exceção em um bloco catch. O código no bloco catch será executado somente se o código dentro do bloco try gerar uma exceção do tipo especificado na instrução catch.

    O esqueleto a seguir mostra como os blocos try e catch são organizados normalmente:

    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();
    }
    

    Quando uma exceção é lançada, o controle passa para o primeiro bloco catch cuja declaração de exceção corresponde ao tipo da exceção. Você pode lidar seletivamente com diferentes tipos de exceções com blocos catch sequenciais, conforme listado abaixo:

    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();
    }
    

Para obter mais informações, consulte Exceções: convertendo de macros de exceção MFC.

Confira também

Tratamento de exceção