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.