Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este é um tópico avançado.
Este artigo explica como converter o código existente escrito com macros da Classe do Microsoft Foundation — TRY, CATCH, THROW e assim por diante — para usar as palavras-chave tryde tratamento de exceção do C++ e catchthrow. Os tópicos incluem:
Vantagens da conversão
Você provavelmente não precisa converter o código existente, embora deva estar ciente das diferenças entre as implementações de macro no MFC versão 3.0 e as implementações em versões anteriores. Essas diferenças e alterações subsequentes no comportamento do código são discutidas em Exceções: alterações nas macros de exceção na versão 3.0.
As principais vantagens da conversão são:
O código que usa as palavras-chave de tratamento de exceção do C++ é compilado para um .EXE ou .DLL ligeiramente menor.
As palavras-chave de tratamento de exceção do C++ são mais versáteis: elas podem lidar com exceções de qualquer tipo de dados que possa ser copiado (
int,floatecharassim por diante), enquanto as macros lidam com exceções apenas de classeCExceptione classes derivadas dela.
A principal diferença entre as macros e as palavras-chave é que o código que usa as macros "automaticamente" exclui uma exceção capturada quando a exceção sai do escopo. O código que usa as palavras-chave não o faz, portanto, você deve excluir explicitamente uma exceção capturada. Para obter mais informações, consulte o artigo Exceções: Capturando e excluindo exceções.
Outra diferença é a sintaxe. A sintaxe para macros e palavras-chave difere em três aspectos:
Argumentos de macro e declarações de exceção:
Uma invocação de macro CATCH tem a seguinte sintaxe:
CATCH(exception_class, exception_object_pointer_name)
Observe a vírgula entre o nome da classe e o nome do ponteiro do objeto.
A declaração de exceção para a
catchpalavra-chave usa esta sintaxe:catch(exception_typeexception_name)
Essa instrução de declaração de exceção indica o tipo de exceção que os identificadores de bloco catch.
Delimitação de blocos catch:
Com as macros, a macro CATCH (com seus argumentos) inicia o primeiro bloco catch; a macro AND_CATCH inicia os blocos de captura subsequentes e a macro END_CATCH encerra a sequência de blocos de captura.
Com as palavras-chave, a
catchpalavra-chave (com sua declaração de exceção) começa cada bloco catch. Não há nenhum equivalente à macro END_CATCH ; o bloco catch termina com sua chave de fechamento.A expressão de lançamento:
As macros usam THROW_LAST para gerar novamente a exceção atual. A
throwpalavra-chave, sem argumento, tem o mesmo efeito.
Fazendo a conversão
Para converter código usando macros para usar as palavras-chave de tratamento de exceção do C++
Localize todas as ocorrências das macros MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW e THROW_LAST.
Substitua ou exclua todas as ocorrências das seguintes macros:
TRY (Substitua-o por
try)CATCH (Substitua-o por
catch)AND_CATCH (Substitua-o por
catch)END_CATCH (Excluir)
THROW (Substitua-o por
throw)THROW_LAST (Substitua por
throw)Modifique os argumentos de macro para que eles formem declarações de exceção válidas.
Por exemplo, alteração
CATCH(CException, e)para
catch (CException* e)Modifique o código nos blocos de captura para que ele exclua objetos de exceção conforme necessário. Para obter mais informações, consulte o artigo Exceções: Capturando e excluindo exceções.
Aqui está um exemplo de código de tratamento de exceções usando macros de exceção MFC. Observe que, como o código no exemplo a seguir usa as macros, a exceção e é excluída automaticamente:
TRY
{
// Do something to throw an exception.
AfxThrowUserException();
}
CATCH(CException, e)
{
if (m_bPassExceptionsUp)
THROW_LAST();
if (m_bReturnFromThisFunction)
return;
// Not necessary to delete the exception e.
}
END_CATCH
O código no próximo exemplo usa as palavras-chave de exceção C++, portanto, a exceção deve ser excluída explicitamente:
try
{
// Do something to throw an exception.
AfxThrowUserException();
}
catch (CException* e)
{
if (m_bPassExceptionsUp)
throw;
if (m_bThrowDifferentException)
{
e->Delete();
throw new CMyOtherException;
}
if (m_bReturnFromThisFunction)
{
e->Delete();
return;
}
e->Delete();
}
Para obter mais informações, consulte Exceções: Usando macros MFC e exceções C++.