Exceções: Conversão de Macros de exceção do MFC
Este é um tópico avançado.
Este artigo explica como converter o código existente escrito com macros Microsoft Foundation Class — tente, CATCH, Lançare assim por diante — para usar as palavras-chave manipulação de exceção de C++ tente, catch, e throw.Os tópicos incluem:
Vantagens da conversão
Conversão de código com macros de exceção para usar exceções do C++
Vantagens da conversão
Você provavelmente não precisará converter o código existente, embora você deve 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 subseqüentes no comportamento do código são discutidas em exceções: altera a exceção Macros na versão 3.0.
As vantagens principais de conversão são:
Código que usa as palavras-chave manipulação de exceção de C++ compila para um pouco menor.EXE ou.DLL.
Palavras-chave C++ manipulação de exceção são mais versáteis: eles podem manipular exceções de qualquer tipo de dados que podem ser copiados (int, float, chare assim por diante), enquanto as macros manipulam 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 fica fora do escopo.Código usando as palavras-chave não foi, portanto, você deve explicitamente excluir uma exceção identificada.Para obter mais informações, consulte o artigo exceções: detectar e excluir 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:
A CATCH invocação de macro tem a seguinte sintaxe:
CATCH (exception_class, exception_object_pointer_name)
Observe a vírgula entre o nome da classe e o nome de ponteiro de objeto.
A declaração de exceção para o catch palavra-chave utiliza esta sintaxe:
catch (exception_typeexception_name)
Esta declaração de exceção indica o tipo de exceção a pegadinha bloquear alças.
Delimitação de blocos catch:
Com macros, o CATCH macro (com argumentos) começa o primeiro bloco catch; o AND_CATCH macro começa blocos catch subseqüente e o END_CATCH macro termina a seqüência de blocos catch.
Com palavras-chave, o catch palavra-chave (com sua declaração de exceção) começa a cada bloco catch.Não há nenhum equivalente para o END_CATCH macro; o bloco catch termina com sua chave de fechamento.
A expressão throw:
Usam as macros THROW_LAST para relançar a exceção atual.O throw palavra-chave, sem argumento tem o mesmo efeito.
A conversão
Converter código usando macros para usar palavras-chave C++ manipulação de exceção
Localize todas as ocorrências de macros MFC tente, CATCH, AND_CATCH, END_CATCH, Lançar, e THROW_LAST.
Substituir ou excluir todas as ocorrências das seguintes macros:
Tente (substituir com tente)
CATCH (substituir com catch)
AND_CATCH(Substitua-o com catch)
END_CATCH(Excluir)
Lançar (substituir com throw)
THROW_LAST(Substitua-o com throw)
Modifique os argumentos de macro para que eles formem declarações de exceção válido.
Por exemplo, alterar
CATCH(CException, e)
to
catch(CException* e)
Modificar o código nos blocos catch para que ele exclui objetos exceção conforme necessário.Para obter mais informações, consulte o artigo exceções: detectar e excluir exceções.
Aqui está 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 exemplo a seguir usa as palavras-chave exceção de C++ 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++.