Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo descreve como usar um try-catch-finally bloco para capturar uma exceção.
Versão original do produto: Visual C++
Número original do KB: 815662
Resumo
Um try-catch-finally bloco é um wrapper que você coloca em torno de qualquer código em que uma exceção possa ocorrer. Capturar e lidar com exceções são tarefas de programação padrão.
Um try-catch-finally bloco é composto pelas seguintes seções:
- Qualquer código que possa gerar uma exceção é colocado dentro do bloco try.
- Se uma exceção for lançada, o
catchbloco será inserido e o programa poderá fazer a operação apropriada para recuperar ou alertar o usuário. - O código no
finallybloco é sempre executado e pode fazer a limpeza após a ocorrência de uma exceção. Ofinallybloco é opcional.
Este artigo refere-se aos seguintes namespaces da Biblioteca de Classes do Microsoft .NET Framework: System.IO e System.Security.
Capturar exceções no Visual C++ .NET
Inicie o Visual Studio .NET.
No menu Arquivo , aponte para Novoe clique em Projeto.
No Visual C++, clique em Visual C++ em Tipos de Projeto e, em seguida, clique em Aplicativo de Console CLR em Modelos.
Na caixa Nome, digite Q815662 e clique em OK.
Substitua todo o código na janela de código Q815662.cpp pelo código a seguir. O código declara e inicializa três variáveis. A inicialização de k causa um erro.
#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. }Pressione F5. Você recebe uma
System.DivideByZeroExceptionexceção.Envolva uma
try-catchinstrução em torno do seu código para capturar o erro. O código a seguir captura todos os erros gerados no código e exibe uma mensagem de erro genérica. Substitua o código na janela de código Q815662.cpp pelo seguinte código:#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."); } }Pressione CTRL+F5 para executar o aplicativo.
Observação
A mensagem de erro do
catchbloco é exibida em vez da mensagem de erro de exceção do sistema.Se você precisar fazer limpeza ou pós-processamento independentemente de um erro, use a
__finallytry-catch-finallyparte da instrução. O código na parte finally da instrução é sempre executado, independentemente de uma exceção. O código a seguir exibe a seguinte mensagem no console, mesmo que nenhum erro tenha ocorrido:This statement is always printed.Substitua o código na janela de código Q815662.cpp pelo seguinte código:
#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"); } }Pressione CTRL+F5 para executar o projeto.
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 várias propriedades que podem ajudá-lo a identificar a origem e tem informações de pilha sobre uma exceção. Essas informações podem ser úteis para ajudar a rastrear a causa original da exceção ou podem fornecer uma explicação melhor de sua origem. O exemplo a seguir captura uma exceção e fornece uma mensagem de erro específica. Substitua o código na janela de código Q815662.cpp pelo seguinte código:
#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(); }Até este ponto, você lidou com uma exceção não específica. No entanto, se você souber com antecedência que tipo de exceção ocorrerá, poderá capturar a exceção esperada e processá-la adequadamente. Use os vários blocos catch descritos no código a seguir para capturar todas as outras exceções e lidar com elas:
#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()); } }Como as configurações do computador podem ser diferentes, o exemplo nesta etapa pode ou não gerar uma exceção. Se você quiser forçar uma exceção de entrada/saída (E/S), altere o caminho do arquivo para uma pasta que não existe em seu computador.