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 é um tópico avançado.
Este artigo explica como converter código existente escrito com macros Microsoft Foundation Class — TRY,CATCH,THROW e assim por diante — para usar as palavras-chave tryde manipulação de exceções C++ , catche throw. Os tópicos incluem:
Vantagens da conversão
Você provavelmente não precisa converter o código existente, embora você 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ções C++ é compilado para um .EXE ou .DLL ligeiramente menor.
As palavras-chave de tratamento de exceções C++ são mais versáteis: elas podem lidar com exceções de qualquer tipo de dados que possam ser copiados (
int,float,chare assim 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 utiliza as palavras-chave não faz isso, então deve eliminar explicitamente uma exceção capturada. Para obter mais informações, consulte o artigo Exceptions: Apanhando e Eliminando Excepções.
Outra diferença é a sintaxe. A sintaxe para macros e palavras-chave difere em três aspetos:
Argumentos de macro e declarações de exceção:
Uma invocação de macro CATCH tem a seguinte sintaxe:
CAPTURA(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:captura(exception_typeexception_name)
Esta instrução de declaração de exceção indica o tipo de exceção que o bloco de intercepção manipula.
Delimitação dos blocos de captura:
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 de captura. Não existe uma contrapartida para a macro END_CATCH; o bloco de captura termina com a sua chave de fecho.A expressão de lançamento:
As macros usam THROW_LAST para relançar a exceção atual. A
throwpalavra-chave, sem argumento, tem o mesmo efeito.
Fazendo a conversão
Para converter código que utiliza macros para que utilize as palavras-chave de manipulação de exceções 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 (Exclua-o)
THROW (Substitua-o por
throw)THROW_LAST (Substitua-o por
throw)Modifique os argumentos de macro para que eles formem declarações de exceção válidas.
Por exemplo, alterar
CATCH(CException, e)Para
catch (CException* e)Modifique o código nos blocos catch para que ele exclua objetos de exceção conforme necessário. Para obter mais informações, consulte o artigo Exceptions: Apanhando e Eliminando Excepçõ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 explicitamente excluída:
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++.