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:

  1. 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.

  2. 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.

  3. 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++

  1. Localizar todas as ocorrências do MFC macros TENTE, CATCH, AND_CATCH, END_CATCH, THROW, and THROW_LAST.

  2. 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)

  3. 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)
    
  4. 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++.

Consulte também

Conceitos

Exceção Handling in MFC