Compartilhar via


Exceções: convertendo de macros de exceção MFC

Este é um tópico avançado.

Este artigo explica como converter o código existente escrito com macros da Classe do Microsoft Foundation — TRY, CATCH, THROW e assim por diante — para usar as palavras-chave tryde tratamento de exceção do C++ e catchthrow. Os tópicos incluem:

Vantagens da conversão

Você provavelmente não precisa converter o código existente, embora 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ção do C++ é compilado para um .EXE ou .DLL ligeiramente menor.

  • As palavras-chave de tratamento de exceção do C++ são mais versáteis: elas podem lidar com exceções de qualquer tipo de dados que possa ser copiado (int, floate charassim por diante), enquanto as macros lidam com exceções apenas de classe CException e 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 usa as palavras-chave não o faz, portanto, 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 é a sintaxe. A sintaxe para macros e palavras-chave difere em três aspectos:

  1. Argumentos de macro e declarações de exceção:

    Uma invocação de macro CATCH tem a seguinte sintaxe:

    CATCH(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 catch palavra-chave usa esta sintaxe:

    catch(exception_typeexception_name)

    Essa instrução de declaração de exceção indica o tipo de exceção que os identificadores de bloco catch.

  2. Delimitação de blocos catch:

    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 catch palavra-chave (com sua declaração de exceção) começa cada bloco catch. Não há nenhum equivalente à macro END_CATCH ; o bloco catch termina com sua chave de fechamento.

  3. A expressão de lançamento:

    As macros usam THROW_LAST para gerar novamente a exceção atual. A throw palavra-chave, sem argumento, tem o mesmo efeito.

Fazendo a conversão

Para converter código usando macros para usar as palavras-chave de tratamento de exceção do C++

  1. Localize todas as ocorrências das macros MFC TRY, CATCH, AND_CATCH, END_CATCH, THROW e THROW_LAST.

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

    THROW (Substitua-o por throw)

    THROW_LAST (Substitua por throw)

  3. Modifique os argumentos de macro para que eles formem declarações de exceção válidas.

    Por exemplo, alteração

    CATCH(CException, e)
    

    para

    catch (CException* e)
    
  4. Modifique o código nos blocos de captura para que ele exclua 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 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 excluída explicitamente:

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

Tratamento de Exceções