Partilhar via


Tratamento de exceções no MFC

Este artigo explica os mecanismos de tratamento de exceções disponíveis no MFC. Estão disponíveis dois mecanismos:

  • Exceções C++, disponíveis no MFC versão 3.0 e posterior

  • As macros de exceção do MFC, disponíveis nas versões 1.0 e posteriores do MFC

Se você estiver escrevendo um novo aplicativo usando MFC, você deve usar o mecanismo C++. Você pode usar o mecanismo baseado em macro se seu aplicativo existente já usa esse mecanismo extensivamente.

Você pode converter prontamente o código existente para usar exceções C++ em vez das macros de exceção MFC. As vantagens de converter o seu código e as diretrizes para o fazer estão descritas no artigo Exceções: Conversão a partir das macros de exceção MFC.

Se você já desenvolveu um aplicativo usando as macros de exceção MFC, você pode continuar usando essas macros em seu código existente, enquanto usa exceções C++ em seu novo código. O artigo Exceptions: Changes to Exception Macros in Version 3.0 fornece orientações sobre como fazê-lo.

Observação

Para habilitar o tratamento de exceções C++ em seu código, selecione Habilitar exceções C++ na página Geração de código na pasta C/C++ da caixa de diálogo Páginas de propriedades do projeto ou use a opção de compilador /EHsc .

Este artigo aborda os seguintes tópicos:

Quando usar exceções

Três categorias de resultados podem ocorrer quando uma função é chamada durante a execução do programa: execução normal, execução incorreta ou execução anormal. Cada categoria é descrita abaixo.

  • Execução normal

    A função pode ser executada normalmente e retornar. Algumas funções retornam um código de resultado para o chamador, que indica o resultado da função. Os códigos de resultado possíveis são estritamente definidos para a função e representam a gama de resultados possíveis da função. O código de resultado pode indicar sucesso ou fracasso ou até mesmo indicar um tipo específico de falha que está dentro do intervalo normal de expectativas. Por exemplo, uma função de status de arquivo pode retornar um código que indica que o arquivo não existe. Observe que o termo "código de erro" não é usado porque um código de resultado representa um dos muitos resultados esperados.

  • Execução errada

    O chamador comete algum erro ao passar argumentos para a função ou chama a função em um contexto inadequado. Esta situação causa um erro e deve ser detetado por uma asserção durante o desenvolvimento do programa. Para obter mais informações sobre asserções, consulte Asserções C/C++.

  • Execução anormal

    A execução anormal inclui situações em que condições fora do controlo do programa, tais como falta de memória ou erros de E/S, estão a influenciar o resultado da função. As situações anómalas devem ser tratadas por meio da captura e do lançamento de exceções.

O uso de exceções é especialmente apropriado para situações de execução anómala.

Suporte a exceções MFC

Se você usar as exceções C++ diretamente ou usar as macros de exceção MFC, você usará CException Class ou CExceptionobjetos derivados que podem ser lançados pela estrutura ou pelo seu aplicativo.

A tabela a seguir mostra as exceções predefinidas fornecidas pelo MFC.

Classe de exceção Significado
CMemoryException Classe Falta de memória
CFileException Classe Exceção de arquivo
CArchiveException Classe Exceção de arquivamento/serialização
CNotSupportedException Classe Resposta ao pedido de serviço não suportado
CResourceException Classe Exceção de alocação de recursos do Windows
CDaoException Classe Exceções de banco de dados (classes DAO)
Classe CDBException Exceções de banco de dados (classes ODBC)
COleException Classe Exceções OLE
COleDispatchException Classe Exceções de despacho (automação)
CUserException Classe Exceção que alerta o usuário com uma caixa de mensagem e, em seguida, lança uma classe CException genérica

Desde a versão 3.0, o MFC tem usado exceções C++, mas ainda suporta suas macros de tratamento de exceções mais antigas, que são semelhantes às exceções C++ no formulário. Embora essas macros não sejam recomendadas para nova programação, elas ainda são suportadas para compatibilidade com versões anteriores. Em programas que já usam as macros, você também pode usar livremente exceções C++. Durante o pré-processamento, as macros avaliam as palavras-chave de manipulação de exceção definidas na implementação MSVC da linguagem C++ a partir do Visual C++ versão 2.0. Você pode deixar os macros de exceção existentes inalterados enquanto começa a usar exceções de C++. Para obter informações sobre como misturar macros e manipulação de exceções C++ e sobre como converter código antigo para usar o novo mecanismo, consulte os artigos Exceptions: Using MFC Macros and C++ Exceptions e Exceptions: Converting from MFC Exception Macros. As macros de exceção MFC mais antigas, se ainda as utilizar, correspondem às palavras-chave de exceção C++. Consulte Exceções: alterações em macros de exceção na versão 3.0. MFC não suporta diretamente manipuladores de exceção estruturada (SEH) do Windows NT, conforme discutido em Tratamento de exceção estruturada.

Leitura adicional sobre exceções

Os artigos a seguir explicam o uso da biblioteca MFC para a distribuição de exceções:

Os artigos a seguir comparam as macros de exceção MFC com as palavras-chave de exceção C++ e explicam como você pode adaptar seu código:

Ver também

Práticas recomendadas modernas de C++ para exceções e tratamento de erros