Partilhar 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 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 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 as macros do MFC com palavras-chave exceção de C++ no mesmo bloco porque as macros excluir objetos exception automaticamente quando saem do escopo, enquanto código usando as palavras-chave manipulação de exceção não.Para obter mais informações, consulte o artigo exceções: detectar e excluir 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 fica fora 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 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 e é excluído quando a execução passa de "interno" CATCH bloco.Usando o THROW_LAST macro em vez do Lançar instrução fará com que o "externo" 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 interna Catch blocos

Não pode relançar a exceção atual de dentro 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 conteúdo de exceção.

Consulte também

Conceitos

Tratamento de exceção no MFC