Compartilhar via


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:

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

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

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

  1. Localize todas as ocorrências de macros TRY, CATCH, AND_CATCH, END_CATCH, THROW, e THROW_LASTMFC.

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

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

Consulte também

Conceitos

Tratamento de exceções em MFC