Partilhar via


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

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

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 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 lança 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, você pode simplesmente lançar 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á prosseguir 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 como exceção um item de qualquer tipo, até mesmo uma classe inteira.

    O exemplo a seguir tenta reproduzir um som através de um dispositivo de onda e lança 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 CException objetos (e objetos de classes derivadas de CException). O exemplo acima ignora o mecanismo de exceção do MFC.

Ver também

Tratamento de exceções