Compartilhar via


Exceções e tratamento de exceções

Os recursos de tratamento de exceção da linguagem C# ajudam você a lidar com situações inesperadas ou excepcionais que ocorrem quando um programa está em execução. O tratamento de exceções usa as palavras-chave try, catch e finally para tentar ações que podem não ter êxito, lidar com falhas quando você decide que é razoável fazê-lo e limpar os recursos posteriormente. As exceções podem ser geradas pelo CLR (Common Language Runtime), por bibliotecas .NET ou 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 gerada 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 desenrola a pilha, procurando um método que tenha um bloco catch para o tipo de exceção específico e executará o primeiro bloco catch desse tipo encontrado. Se 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 captura o erro. Sem a manipulação de exceções, esse programa terminaria com um erro de exceção não tratada DivideByZeroException.

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 de exceções

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

  • Exceções são tipos que, em última análise, derivam de System.Exception.
  • Use um bloco try nas instruções que podem lançar exceções.
  • Depois que ocorre uma exceção no bloco try, o fluxo de controle salta para o primeiro manipulador de exceção associado presente ao longo da pilha de chamadas. Em C#, a catch palavra-chave é usada para definir um manipulador de exceção.
  • Se nenhum manipulador de exceção para uma determinada exceção estiver presente, o programa interromperá a execução com uma mensagem de erro.
  • Não capture uma exceção, a menos que você possa manipulá-la e deixar o aplicativo em um estado conhecido. Se você capturar System.Exception, relance-o usando a palavra-chave throw no final do bloco catch.
  • Se um catch bloco definir uma variável de exceção, você poderá usá-la 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.
  • 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 gerada. Use um finally bloco para liberar recursos, por exemplo, para fechar todos os 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ção estruturado do Win32. Para obter mais informações, consulte Tratamento Estruturado de Exceções (C/C++) e Um Curso Intensivo sobre as Profundezas do Tratamento de Exceções Estruturadas do Win32.

Especificação da linguagem C#

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

Consulte também