Como capturar exceções no Visual C++

IMPORTANTE: Este artigo foi traduzido por um sistema de tradução automática (também designado por Machine Translation ou MT), não tendo sido portanto traduzido ou revisto por pessoas. A Microsoft possui artigos traduzidos por aplicações (MT) e artigos traduzidos por tradutores profissionais, com o objetivo de oferecer em português a totalidade dos artigos existentes na base de dados de suporte. No entanto, a tradução automática não é sempre perfeita, podendo conter erros de vocabulário, sintaxe ou gramática. A Microsoft não é responsável por incoerências, erros ou prejuízos ocorridos em decorrência da utilização dos artigos MT por parte dos nossos clientes. A Microsoft realiza atualizações freqüentes ao software de tradução automática (MT). Obrigado.

Clique aqui para ver a versão em Inglês deste artigo: 815662
Para obter uma Microsoft Visual translation from VPE for Csharp .NET versão deste artigo, consulte 308345.
Para uma versão deste artigo do Microsoft Visual Basic. NET, consulte 301283.
Este artigo se refere aos seguintes namespaces Microsoft .NET Framework Class Library:
  • System.IO
  • System.Security

NESTA TAREFA

Sumário
Captura e lidar com exceções são programação padrão tarefas. Este artigo descreve como usar um bloco try-catch-finally para capturar uma exceção. Um bloco try-catch-finally é um wrapper que você coloca em torno de qualquer código onde pode ocorrer uma exceção.

Um bloco try-catch-finally é composto das seções a seguir:
  • Qualquer código que pode lançar uma exceção é colocado dentro do bloco try .
  • Se uma exceção é lançada, o bloco catch é inserido e o programa pode executar a operação apropriada para recuperar ou para alertar o usuário.
  • O código no bloco finally será sempre executado e pode executar a limpeza após uma exceção. O bloco finally é opcional.
back to the top

Requisitos

A lista a seguir descreve o hardware recomendado, software, infra-estrutura de rede e service packs que você precisa:
  • Microsoft Windows XP Professional, Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server e Microsoft Windows Server 2003
  • Microsoft Visual C++ .NET ou Microsoft Visual C++ 2005
back to the top

Como capturar exceções no Visual C++ .NET ou no Visual C++ 2005

  1. Inicie Microsoft Visual Studio .NET ou Microsoft Visual Studio 2005.
  2. No menu arquivo , aponte para novo e, em seguida, clique em Project .
  3. No Visual Studio .NET 2002, clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Aplicativo de C++ gerenciado em modelos .

    No Visual Studio .NET 2003, clique em Projetos do Visual c++ em Tipos de projeto e, em seguida, clique em Aplicativo de console (NET) em modelos .

    No Visual C++ 2005, clique em Visual C++ em Tipos de projeto e, em seguida, clique em Aplicativo de console CLR em modelos .
  4. Na caixa nome , digite Q815662 e, em seguida, clique em OK .
  5. Substitua todo o código na janela de código Q815662.cpp com o seguinte código. O código declara e inicializa três variáveis. Um erro faz com que a inicialização do k .
    #include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>using namespace System;void _tmain(void){	Console::WriteLine("We're going to divide 10 by 0 and see what happens...");	Console::WriteLine();	int i = 10;	int j = 0;	int k = i/j; //Error on this line.}
    Observação você deve adicionar o common language runtime oferecem suporte a compilador opção (/ CLR: oldSyntax) no Visual C++ 2005 a compilar com êxito o exemplo de código anterior. Para adicionar a opção de compilador de suporte de tempo de execução idioma comum no Visual C++ 2005, siga estas etapas:
    1. Clique em Project e clique em <ProjectName> propriedades .

      Observação <ProjectName> é um espaço reservado para o nome do projeto.
    2. Expanda Configuration Properties e, em seguida, clique em Geral .
    3. Clique para selecionar Common Language Runtime suporte, sintaxe antiga (/ CLR: oldSyntax) no projeto oferece suporte a Common Language Runtime configuração no painel à direita, clique em Aplicar e em seguida, clique em OK .
    Para obter mais informações sobre o common language runtime oferece suporte à opção do compilador, visite o seguinte site da Microsoft:
    / clr (Common Language Runtime Compilation)
    http://msdn2.microsoft.com/en-us/library/k8d11d4s.aspx
    Estas etapas se aplicam o artigo inteiro.
  6. Pressione F5. Você recebe uma exceção System.DivideByZeroException .
  7. Coloque uma instrução try-catch em torno de seu código para capturar o erro. O código a seguir captura todos os erros que são lançados no código e exibe uma mensagem de erro genérico. Substitua o código na janela de código Q815662.cpp com o código a seguir:
    #include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>using namespace System;void _tmain(void){	try	{		Console::WriteLine("We're going to divide 10 by 0 and see what happens...");		Console::WriteLine();		int i = 10;		int j = 0;		int k = i/j; //Error on this line.	}	catch(...)	{		Console::WriteLine("An error occurred.");	}}
  8. Pressione CTRL+F5 para executar o aplicativo. Observe que a mensagem de erro de bloco catch é exibida em vez da mensagem de erro de exceção do sistema.
  9. Se você deve fazer a limpeza ou pós-processamento independentemente de um erro, use a parte __finally da instrução try-catch-__finally . O código na parte Finalmente a instrução sempre é executado, independentemente de uma exceção. O código a seguir exibe a seguinte mensagem no console, mesmo se nenhum erro ocorreu:
    Essa instrução sempre é impresso.
    Substitua o código na janela de código Q815662.cpp com o código a seguir:
    #include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>using namespace System;void _tmain(void){	try	{		Console::WriteLine("We're going to divide 10 by 0 and see what happens...");		Console::WriteLine();		int i = 10;		int j = 0;		int k = i/j; //Error on this line.	}	catch(...)	{		Console::WriteLine("An error occurred.");	}	__finally //This section is performed regardless of the above processing.	{		Console::WriteLine();		Console::WriteLine("This statement is always printed");	}}
  10. Pressione CTRL+F5 para executar o projeto.
  11. Você pode usar o objeto de exceção com a instrução catch para recuperar detalhes sobre a exceção. Um objeto de exceção tem um número de propriedades que podem ajudar você a identificar a origem e tem informações de pilha sobre uma exceção. Essa informação pode ser muito útil para ajudar a rastrear a causa original da exceção, ou pode fornecer uma explicação melhor da sua fonte. O exemplo a seguir captura uma exceção e oferece uma mensagem de erro específico. Substitua o código na janela de código Q815662.cpp com o código a seguir:
    #include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>using namespace System;using namespace System::Reflection;void _tmain(void){	try	{		Console::WriteLine("We're going to divide 10 by 0 and see what happens...");		Console::WriteLine();		int i = 10;		int j = 0;		int k = i/j; //Error on this line.	}	catch(Exception *e)	{		Console::WriteLine("An error occurred.");		Console::WriteLine(e->Message); // Print the error message.		Console::WriteLine(e->StackTrace); //String that contains the stack trace for this exception.	}	__finally //This section is performed regardless of the above processing.	{		Console::WriteLine();		Console::WriteLine("This statement is always printed");	}	Console::ReadLine(); }
  12. Até este ponto, você tem lidou com uma exceção não-específica. No entanto, se você souber antecipadamente que tipo de exceção está prestes a ocorrer, pode capturar a exceção prevista e processá-lo adequadamente. Use os vários blocos catch que estão descritos no seguinte código para capturar todas as outras exceções e lidar com eles:
    #include "stdafx.h"#using <mscorlib.dll>#include <tchar.h>using namespace System;using namespace System::IO;using namespace System::Security;void _tmain(void){	try	{		File::Create("c:\\temp\\testapp.txt"); //Can fail for a number of resons	}	// This error may occur if the temp folder does not exist.	catch(IOException *ioe)	{		Console::WriteLine("An IOException exception occurred!");		Console::WriteLine(ioe->ToString());	}	// You do not have the appropriate permission to take this action.	catch(SecurityException *se)	{		Console::WriteLine("An SecurityException exception occur	}	// Catch all exceptions	catch(Exception *e)	{		Console::WriteLine(e->ToString());	}}
    porque as configurações do computador podem ser diferentes, o exemplo nesta etapa pode ou não pode lançar uma exceção. Se você quiser forçar uma exceção de E/S, altere o caminho do arquivo para uma pasta que não existe no computador.
back to the top
exceção tente capturar finalmente erro
Referências
Para obter mais informações sobre tratamento de exceções no Managed Extensions para C++, consulte a seguinte site da Microsoft Developer Network (MSDN):back to the top

Propriedades

ID do Artigo: 815662 - Última Revisão: 05/12/2007 06:40:39 - Revisão: 2.2

Microsoft Visual C++ 2005 Express Edition, Microsoft Visual C++ .NET 2003 Standard Edition, Microsoft Visual C++ .NET 2002 Standard Edition, Microsoft .NET Framework 1.0, Microsoft .NET Framework 1.1

  • kbmt kbhowtomaster kbhowto kbcode KB815662 KbMtpt
Comentários