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.