Partilhar via


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

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

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

O catch bloqueio deve excluir uma exceção quando:

  • O catch bloqueio lança uma nova exceção.

    Claro, você não deve excluir a exceção se você 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 de membro Delete para excluir a exceção. Não utilize a delete palavra-chave, pois esta pode falhar se a exceção não estiver na heap.

Para capturar e excluir exceções

  1. Use a palavra-chave try para configurar um bloco try. Execute quaisquer instruções de programa que possam lançar uma exceção dentro de um try bloco.

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

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

    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 catch bloco cuja declaração de exceção corresponde ao tipo da exceção. Você pode lidar seletivamente com diferentes tipos de exceções com blocos sequenciais catch , 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.

Ver também

Tratamento de exceções