Compartilhar via


Exceções: usando macros MFC e exceções do C++

Este artigo descreve considerações para escrever o código que usa macros manipulação de exceções gerais de MFC e as palavras-chave de controle de exceções das linguagens C++.

Este artigo abrange os seguintes tópicos:

  • Palavra-chave e macros de combinação de exceção

  • Blocos de try/catch de dentro dos blocos da tentativa

Palavra-chave e macros de combinação de exceção

Você pode combinar palavras-chave de macros de exceção MFC e de exceção C++ no mesmo programa. Mas você não pode combinar macros de MFC com as palavras-chave de exceção C++ no mesmo bloco como macros excluem objetos de exceção automaticamente quando sair do escopo, enquanto que o código que usa palavras-chave manipulação de exceções gerais não. Para obter mais informações, consulte o artigo Exceções: Capturando e excluindo exceções.

A principal diferença entre as macros e keywords é que as macros “automaticamente” excluir uma exceção capturada quando a exceção sai do escopo. O código que usa palavras-chave não faz; as exceções capturadas em um bloco de captura devem ser explicitamente excluídas. Macros de combinação e de exceção C++ palavras-chave podem causar vazamentos de memória quando um objeto de exceção não é excluído, ou corrupção do heap quando uma exceção é excluída duas vezes em.

O código a seguir, por exemplo, invalida o ponteiro de exceção:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      throw;  // Invalid attempt to throw exception 
            // to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is invalid because 
    // it was deleted in the inner catch block.
}
END_CATCH

O problema ocorre porque e é excluído quando a execução passa bloco “interno” de CATCH . Usar a macro de THROW_LAST em vez da instrução de THROW fará com que o bloco “externa” de CATCH recebe um ponteiro válido:

TRY
{
   TRY
   {
      // Do something to throw an exception.
      AfxThrowUserException();
   }
   CATCH(CException, e)  // The "inner" catch block
   {
      THROW_LAST(); // Throw exception to the outer catch block below.
   }
   END_CATCH
}
CATCH(CException, e)  // The "outer" catch block
{
    // Pointer e is valid because 
    // THROW_LAST() was used.
}
END_CATCH

Blocos de try/catch de dentro dos blocos da tentativa

Não é possível novamente geram a exceção atual dentro de um bloco de try que está dentro de um bloco de CATCH . O exemplo a seguir é inválido:

TRY
{
   // Do something to throw an exception.
   AfxThrowUserException();
}
CATCH(CException, e)
{
   try
   {
      throw;  // Wrong.  Causes e (the exception  
            // being thrown) to be deleted.
   }
   catch(CException* exception)
   {
      exception->ReportError();
   }
}
END_CATCH

Para obter mais informações, consulte Exceções: Conteúdo de auditoria de exceção.

Consulte também

Conceitos

Tratamento de exceções em MFC