Exceções: Conversão de macros de exceção do MFC
Este é um tópico avançado.
Este artigo explica como converter código existente escrito com macros Microsoft Foundation classe — TENTE, CATCH, THROWe assim por diante — para usar o C++ manipulação de exceção palavras-chave Tente, catch, and throw. Os tópicos incluem:
Vantagens de conversão
Conversão do código com macros de exceção para usar exceções do C++
Vantagens da conversão
Você provavelmente não precisa converter o código existente, embora você deva ciente das diferenças entre as implementações de macro na versão 3.0 do MFC e as implementações em versões anteriores.Essas diferenças e as alterações subseqüentes feitas no código de comportamento são discutidas em Exceções: Alterações à exceção macros na versão 3.0.
As vantagens principais de conversão são:
Código que usa as palavras-chave de manipulação de exceção de C++ compila um .exe ou .dll um pouco menor.
As palavras-chave de manipulação de exceção de C++ são mais versátil: Eles podem manipular exceções de qualquer tipo de dados que podem ser copiadas (int, float, chare assim por diante), enquanto as macros manipular exceções apenas da classe CException e classes derivado dele.
A principal diferença entre as macros e as palavras-chave é que o código usando as macros "automaticamente" exclui uma exceção identificada quando a exceção sai do escopo.Código usando as palavras-chave, não, portanto, você deve explicitamente excluir uma exceção identificada.Para obter mais informações, consulte o artigo Exceções: Captura e excluindo exceções.
Outra diferença é a sintaxe.A sintaxe para palavras-chave e as macros difere em três aspectos:
Argumentos de macro e declarações de exceção:
A CATCH macro chamada tem a seguinte sintaxe:
CATCH( exception_class, exception_object_pointer_name )
Observe o ponto-e-vírgula entre o nome de classe e o nome do objeto de ponteiro.
A declaração de exceção para o catchpalavra-chave utiliza esta sintaxe:
catch( exception_type exception_name**)**
Esta demonstrativo de exceção indica o tipo de exceção do catch bloco alças.
Delimitação de blocos catch:
Com as macros, o CATCH macro (com os argumentos) começa o primeiro problema; a AND_CATCH macro começa blocos catch subseqüente e o END_CATCH macro termina a sequência de blocos catch.
Com as palavras-chave, a catch palavra-chave (com sua declaração de exceção) começa a cada bloco catch.Não há nenhum equivalente à END_CATCH macro; as extremidades do bloco catch com sua chave de fechamento.
A expressão lançar:
As macros usam THROW_LAST para relançar a exceção corrente. The throw palavra-chave, sem argumento algum, tem o mesmo efeito.
Fazendo a conversão
Para converter o código usando macros para usar as palavras-chave de manipulação de exceção de C++
Localizar todas as ocorrências do MFC macros TENTE, CATCH, AND_CATCH, END_CATCH, THROW, and THROW_LAST.
Substituir ou excluir todas as ocorrências das seguintes macros:
TENTE (substituir com Tente)
CATCH (substituir com catch)
AND_CATCH (substituir com catch)
END_CATCH (Excluir)
THROW (substituir com throw)
THROW_LAST (Substituí-lo throw)
Modifique os argumentos de macro para que eles formam declarações de exceção válido.
Por exemplo, alterar
CATCH(CException, e)
para
catch(CException* e)
Modificar o código nos blocos catch para que ele exclui objetos exception sistema autônomo necessário.Para obter mais informações, consulte o artigo Exceções: Captura e excluindo exceções.
Eis um exemplo de código de manipulação de exceção usando macros de exceção do MFC.Observe que, como o código no exemplo a seguir usa as macros, a exceção e é excluído 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 de C++, a exceção deve ser explicitamente excluído:
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++.