Exceções e manipulação de exceções

Os recursos de manipulação de exceção da linguagem C# ajudam você a lidar com quaisquer situações excepcionais ou inesperadas que ocorram quando um programa for executado. A manipulação de exceções usa as palavras-chave try, catch e finally para executar ações que talvez não sejam bem-sucedidas, lidar com falhas quando você decidir que é razoável fazê-lo e limpar recursos depois disso. Podem ser geradas exceções pelo CLR (Common Language Runtime), pelo .NET, por quaisquer bibliotecas de terceiros ou pelo código do aplicativo. As exceções são criadas usando a palavra-chave throw.

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 isso acontecer, o CLR desenrolará a pilha, em busca de um método com um bloco catch para o tipo de exceção específico e executará o primeiro o bloco catch desse tipo que encontrar. Se ele não encontrar um bloco catch apropriado 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ção, esse programa encerraria com um DivideByZeroException não resolvido.

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("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Visão geral sobre exceções

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

  • As exceções são tipos que derivam, por fim, de System.Exception.
  • Use um bloco try nas instruções que podem lançar exceções.
  • Quando ocorre uma exceção no bloco try, o fluxo de controle vai para o primeiro manipulador de exceção associada que está presente em qualquer lugar na pilha de chamadas. No C#, a palavra-chave catch é 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 bloco catch define uma variável de exceção, você pode 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 palavra-chave throw.
  • 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 bloco finally será executado mesmo que seja lançada uma exceção. Use um bloco finally para liberar recursos, por exemplo, para fechar todos os fluxos ou arquivos que foram abertos no bloco try.
  • As exceções gerenciadas no .NET são implementadas sobre o mecanismo de manipulação de exceções estruturadas do Win32. Para obter mais informações, consulte Manipulação de exceções estruturadas (C/C++) e Curso rápido sobre a manipulação de exceções estruturadas do Win32.

Especificação da Linguagem C#

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

Confira também