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.