Partilhar via


Exceções e tratamento de exceções

Os recursos de tratamento de exceções da linguagem C# ajudam você a lidar com quaisquer situações inesperadas ou excecionais que ocorram quando um programa está em execução. O tratamento de exceções usa as trypalavras-chave , catche finally para tentar ações que podem não ter êxito, para lidar com falhas quando você decide que é razoável fazê-lo e para limpar recursos depois. As exceções podem ser geradas pelo Common Language Runtime (CLR), pelo .NET ou bibliotecas de terceiros ou pelo código do aplicativo. As exceções são criadas usando a throw palavra-chave.

Em muitos casos, uma exceção pode ser lançada não por um método que seu código chamou diretamente, mas por outro método mais abaixo na pilha de chamadas. Quando uma exceção é lançada, o CLR desenrolará a pilha, procurando um bloco catch para o tipo de exceção específico e executará o primeiro bloco catch que encontrar. Se ele não encontrar nenhum bloco apropriado catch em qualquer lugar na pilha de chamadas, ele encerrará o processo e exibirá uma mensagem para o usuário.

Neste exemplo, um método testa a divisão por zero e deteta o erro. Sem o tratamento de exceção, este programa terminaria com um erro DivideByZeroException não foi tratado .

public class ExceptionTest
{
    static double SafeDivision(double x, double y)
    {
        if (y == 0)
            throw new DivideByZeroException();
        return x / y;
    }

    public static void Main()
    {
        // Input for test purposes. Change the values to see
        // exception handling behavior.
        double a = 98, b = 0;
        double result;

        try
        {
            result = SafeDivision(a, b);
            Console.WriteLine($"{a} divided by {b} = {result}");
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Visão geral das exceções

As exceções têm as seguintes propriedades:

  • As exceções são tipos que, em última análise, derivam de System.Exception.
  • Use um try bloco em torno das instruções que podem gerar exceções.
  • Quando uma exceção ocorre no try bloco, o fluxo de controle salta para o primeiro manipulador de exceção associado que está presente em qualquer lugar na pilha de chamadas. Em C#, a catch palavra-chave é usada para definir um manipulador de exceções.
  • Se nenhum manipulador de exceção para uma determinada exceção estiver presente, o programa para de ser executado com uma mensagem de erro.
  • Não pegue uma exceção, a menos que você possa lidar com ela e deixar o aplicativo em um estado conhecido. Se apanhares System.Exception, lança-o novamente no final do bloco throw usando a palavra-chave catch.
  • Se um catch bloco definir uma variável de exceção, você poderá usá-lo para obter mais informações sobre o tipo de exceção que ocorreu.
  • As exceções podem ser geradas explicitamente por um programa usando a throw palavra-chave.
  • Os objetos de exceção contêm informações detalhadas sobre o erro, como o estado da pilha de chamadas e uma descrição de texto do erro.
  • O código em um finally bloco é executado independentemente de uma exceção ser lançada. Use um finally bloco para liberar recursos, por exemplo, para fechar quaisquer fluxos ou arquivos que foram abertos no try bloco.
  • As exceções gerenciadas no .NET são implementadas sobre o mecanismo de tratamento de exceções estruturadas do Win32. Para obter mais informações, consulte Structured Exception Handling (C/C++) e A Crash Course on the Depths of Win32 Structured Exception Handling.

Especificação da linguagem C#

Para obter mais informações, consulte Exceções na especificação da linguagem C#. A especificação da linguagem é a fonte definitiva para a sintaxe e o uso do C#.

Ver também