Compartilhar via


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

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

Este artigo aborda os seguintes tópicos:

  • Combinação de palavras-chave de exceção e macros

  • Tente blocos dentro de blocos catch

Combinação de palavras-chave de exceção e macros

Você pode misturar as macros de exceção do MFC e palavras-chave exceção de C++ no mesmo programa.Mas você não pode misturar macros MFC com C++ exceção palavras-chave no mesmo bloco porque as macros excluir objetos exception automaticamente quando forem fora do escopo, e o código usando as palavras-chave de manipulação de exceção não.Para obter mais informações, consulte o artigo Exceções: Captura e excluindo exceções.

A principal diferença entre as macros e as palavras-chave é que as macros "automaticamente" excluir uma exceção identificada quando a exceção sai do escopo.Código usando as palavras-chave não; exceções detectadas em um bloco catch devem ser explicitamente excluídas.Mistura de macros e palavras-chave de exceção de C++ pode causar vazamentos de memória quando um objeto de exceção não é excluído ou corrupção de pilha quando uma exceção é excluída duas vezes.

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 o eé excluída quando a execução passará de "interno" CATCH bloco.Usando o THROW_LAST macro em vez da THROW demonstrativo fará com que o "externa" CATCH bloco para receber 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

Tente blocos Inside Catch blocos

Não é possível relançar a exceção corrente a partir de um Tente bloco que está dentro de um CATCH bloco.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: Examinando Sumário exceção.

Consulte também

Conceitos

Exceção Handling in MFC