Exceções: convertendo a partir de macros de exceção MFC
Este é um tópico avançada.
Este artigo explica como converter o código existente gravado com macros da classe do Microsoft — TRY, CATCH, THROW, etc — para usar as palavras-chave try, catch, e throwde controle de exceções das linguagens C++. Os tópicos incluem:
Vantagens de conversão
Convertendo o código com macros de exceção para usar exceções C++
Vantagens de conversão
Você provavelmente não precisa converter o código existente, embora você deve estar ciente das diferenças entre as implementações macro na versão 3,0 do MFC e as implementações em versões anteriores. Essas diferenças e as alterações subsequentes no comportamento do código são discutidas em Exceções: Alterações em macros de exceção na versão 3,0.
As principais vantagens de conversão são:
O código que usa palavras-chave de controle de exceções das linguagens C++ compila a um .EXE ou a um .DLL ligeiramente menor.
As palavras-chave de controle de exceções das linguagens C++ são mais versáteis: Podem tratar exceções de qualquer tipo de dados que podem ser copiadas (int, float, char, e assim por diante), enquanto que as macros controlam somente exceções da classe CException e das classes derivadas delas.
A principal diferença entre as macros e keywords é aquele código que usa macros “automaticamente” exclui uma exceção capturada quando a exceção sai do escopo. O código que usa palavras-chave não faz, assim 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 é sintaxe. A sintaxe para macros e palavra-chave difere em três aspectos:
Argumentos e declarações macro de exceção:
Uma invocação macro de CATCH tem a seguinte sintaxe:
Exception_class deCATCH(, *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 palavra-chave de catch usa esta sintaxe:
*exception_name *)de exception_typedecatch(
Essa instrução de declaração de exceção indica o tipo de exceção os identificadores do bloco de captura.
Delimitação de blocos de try/catch:
Com macros, a macro de CATCH (com seus argumentos) inicia o primeiro bloco de captura; a macro de AND_CATCH inicia blocos subsequentes de captura, e a macro de END_CATCH finaliza a sequência de blocos de try/catch.
Com as palavras-chave, a palavra-chave de catch (com sua declaração de exceção) inicia cada bloco de captura. Não há nenhuma contraparte a macro de END_CATCH ; o bloco de captura termina com a chave de fechamento.
A expressão de lançamento:
Macros usam o novo lançamento de THROW_LAST a exceção atual. A palavra-chave de throw , sem o argumento, tem o mesmo efeito.
Para fazer a conversão
Para converter o código usando macros para usar as palavras-chave de controle de exceções das linguagens C++
Localize todas as ocorrências de macros TRY, CATCH, AND_CATCH, END_CATCH, THROW, e THROW_LASTMFC.
Substituir ou excluir todas as ocorrências de macros seguintes:
TRY (substitua pelo try)
CATCH (substitua pelo catch)
AND_CATCH (substitua pelo catch)
END_CATCH (excluir ele)
THROW (substitua pelo throw)
THROW_LAST (substitua pelo throw)
Modifique os argumentos macro de modo que formem declarações válidos de exceção.
Por exemplo, alteração
CATCH(CException, e)
para
catch(CException* e)
Modifique o código em blocos de try/catch de modo que exclui 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 do código de manipulação de exceções gerais usando macros de exceção MFC. Observe que porque o código no exemplo a seguir usa macros, a exceção e será 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 exemplo seguinte usa palavras-chave de exceção C++, 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 de MFC e exceções C++.