Compartilhar via


Exceções: lançando exceções de suas próprias funções

É possível usar o paradigma de tratamento de exceções do 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ê poderá gerar exceções de seu próprio código se estiver escrevendo funções que podem encontrar condições excepcionais.

Quando uma exceção é lançada, a execução da função atual é interrompida e salta diretamente para o catch bloco do quadro de exceção mais interno. O mecanismo de exceção ignora o caminho de saída normal 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 lançar uma exceção

  1. Use uma das funções auxiliares do MFC, como AfxThrowMemoryException. Essas funções geram 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 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, 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 se aplica apenas a ponteiros para CException objetos (e objetos de CExceptionclasses derivadas). O exemplo acima ignora o mecanismo de exceção do MFC.

Consulte também

Tratamento de Exceções