Compartilhar via


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

É possível usar o paradigma de tratamento de exceções MFC apenas para capturar exceções geradas por funções no MFC ou em outras bibliotecas. Além de capturar exceções geradas pelo código de biblioteca, você pode lançar exceções do seu próprio código se estiver escrevendo funções que podem se deparar com condições excepcionais.

Quando uma exceção é lançada, a execução da função atual é interrompida e salta diretamente para o bloco catch do quadro da exceção mais interna. O mecanismo de exceção ignora o caminho de saída normal a partir de uma função. Portanto, você deve ter certeza de excluir os blocos de memória que seriam excluídos em uma saída normal.

Para gerar uma exceção

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

    No exemplo a seguir, uma função tenta alocar dois blocos de memória e gera uma exceção se uma das alocações 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, você poderá simplesmente gerar a exceção de memória. Se a primeira alocação for bem-sucedida, mas a segunda falhar, você deverá liberar o primeiro bloco de alocação antes de lançar a exceção. Se ambas as alocações forem bem-sucedidas, você poderá continuar normalmente e liberar os blocos ao sair da função.

    • ou -
  2. Use uma exceção definida pelo usuário para indicar uma condição de problema. Você pode lançar um item de qualquer tipo, até mesmo uma classe inteira, como sua exceção.

    O exemplo a seguir tenta reproduzir um som por meio de um dispositivo de onda e gera 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;
       }
    

Observação

O tratamento padrão de exceções do MFC aplica-se apenas a ponteiros para objetos CException (e objetos de classes derivadas CException). O exemplo acima ignora o mecanismo de exceção do MFC.

Confira também

Tratamento de exceção