Partilhar via


Exceções: lançando exceções a partir das funções próprias

É possível usar somente o paradigmas manipulação de exceções gerais de MFC para capturar as exceções lançadas por funções em MFC ou em outras bibliotecas. Além de capturar as exceções lançadas pelo código de biblioteca, você pode lançar exceções de seu próprio código se você estiver escrevendo as funções que podem encontrar condições excepcionais.

Quando uma exceção é gerada, a execução da função atual será interrompida e ignorará diretamente ao bloco de catch do quadro da exceção interna especificados. O mecanismo de exceção ignora o caminho de saída normal de uma função. Em virtude disso, você deve ter a certeza de excluir os blocos de memória que serão excluídos em uma saída regular.

Para gerar uma exceção

  1. Use uma das funções auxiliares MFC, como AfxThrowMemoryException. Essas funções emitem um objeto pré-alocados de exceção do tipo apropriado.

    No exemplo a seguir, uma função tenta atribuir dois blocos de memória e lançará uma exceção se qualquer alocação falhar:

    {
        char* p1 = (char*)malloc( SIZE_FIRST );
        if( p1 == NULL )
            AfxThrowMemoryException();
        char* p2 = (char*)malloc( SIZE_SECOND );
        if( p2 == NULL )
        {
            free( p1 );
            AfxThrowMemoryException();
        }
    
        // ... Do something with allocated blocks ... 
    
        // In normal exit, both blocks are deleted.
        free( p1 );
        free( p2 );
    }
    

    Se a primeira alocação falhar, basta lançar exceção de memória. Se a primeira alocação é com êxito mas segunda falha, você deve liberar o primeiro bloco de alocação antes de gerar a exceção. Se ambas as alocações êxito, você pode continuar normalmente e liberar os blocos ao sair da função.

     -ou- 

  2. Use uma exceção definido pelo usuário para indicar uma condição do problema. Você pode gerar um item de qualquer tipo, até mesmo uma classe inteira, como a exceção.

    O exemplo a seguir tenta executar um som por um dispositivo de onda e lançará uma exceção se houver uma falha.

    #define WAVE_ERROR -5
    {
       // This Win32 API returns 0 if the sound cannot be played. 
       // Throw an integer constant if it fails. 
       if( !PlaySound(_T("SIREN.WAV"), NULL, SND_ASYNC) )
          throw WAVE_ERROR;
    }
    

Dica

Os MFC usam como padrão a manipulação de exceções são válidas somente para ponteiros para os objetos de CException (e os objetos de CException- classes derivadas.)O mecanismo de exceção MFC acima dos desvios de exemplo.

Consulte também

Conceitos

Tratamento de exceções em MFC