Compartilhar via


Capturar exceções no Visual C++

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 catch bloco será inserido e o programa poderá fazer a operação apropriada para recuperar ou alertar o usuário.
  • O código no finally bloco é sempre executado e pode fazer a limpeza após a ocorrência de uma exceção. O finally bloco é 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

  1. Inicie o Visual Studio .NET.

  2. No menu Arquivo , aponte para Novoe clique em Projeto.

  3. No Visual C++, 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 clique em OK.

  5. 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.
    }
    
  6. Pressione F5. Você recebe uma System.DivideByZeroException exceção.

  7. Envolva uma try-catch instruçã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.");
        }
    }
    
  8. Pressione CTRL+F5 para executar o aplicativo.

    Observação

    A mensagem de erro do catch bloco é exibida em vez da mensagem de erro de exceção do sistema.

  9. Se você precisar fazer limpeza ou pós-processamento independentemente de um erro, use a __finally try-catch-finally parte 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");
        }
    }
    
  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 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();
    }
    
  12. 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.