Compartilhar via


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:

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

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

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

  1. Localize todas as ocorrências de macros MFC tente, CATCH, AND_CATCH, END_CATCH, Lançar, e THROW_LAST.

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

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

Consulte também

Conceitos

Tratamento de exceção no MFC