Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo discute considerações para escrever código que usa as macros de manipulação de exceções MFC e as palavras-chave de manipulação de exceções C++.
Este artigo aborda os seguintes tópicos:
Misturando palavras-chave de exceção e macros
Você pode misturar macros de exceção MFC e palavras-chave de exceção C++ no mesmo programa. Mas você não pode misturar macros MFC com palavras-chave de exceção C++ no mesmo bloco porque as macros excluem objetos de exceção automaticamente quando saem do escopo, enquanto o código usando as palavras-chave de tratamento de exceções não. Para obter mais informações, consulte o artigo Exceptions: Apanhando e Eliminando Excepções.
A principal diferença entre as macros e as palavras-chave é que as macros excluem "automaticamente" uma exceção capturada quando a exceção sai do escopo. Código que utiliza as palavras-chave não; as exceções apanhadas num bloco de captura devem ser explicitamente removidas. Misturar macros e palavras-chave de exceção em C++ pode causar vazamentos de memória quando um objeto de exceção não é eliminado ou corrupção de heap quando uma exceção é eliminada 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 para fora do bloco CATCH "interno". Usar a macro THROW_LAST em vez da instrução THROW fará com que o bloco CATCH "externo" receba 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
Experimente blocos dentro de blocos de captura
Não é possível relançar a exceção atual de dentro de um try bloco que está dentro de um bloco 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: examinando o conteúdo da exceção.