Partilhar via


Exceções e Tratamento de Exceções

As características de tratamento de exceções da língua C# ajudam-no a lidar com quaisquer situações inesperadas ou excecionais que ocorram quando um programa está em execução. O tratamento de exceções utiliza o try, catche finally palavras-chave para tentar ações que podem não ter sucesso, para lidar com falhas quando decide que é razoável fazê-lo, e para limpar recursos depois. As exceções podem ser geradas pelo tempo comum de execução da linguagem (CLR), por .NET ou bibliotecas de terceiros, ou por código de aplicação. As exceções são criadas utilizando a throw palavra-chave.

Em muitos casos, uma exceção pode ser lançada não por um método que o 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 método com um catch bloco para o tipo de exceção específica, e executará o primeiro catch bloco que encontrar. Se não encontrar nenhum bloco apropriado catch em qualquer lugar da pilha de chamadas, terminará o processo e apresentará uma mensagem ao utilizador.

Neste exemplo, um método testa a divisão por zero e apanha o erro. Sem o tratamento de exceção, este programa terminaria com um erro 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("{0} divided by {1} = {2}", a, b, result);
        }
        catch (DivideByZeroException)
        {
            Console.WriteLine("Attempted divide by zero.");
        }
    }
}

Visão geral das 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 try bloco em torno das declarações que podem lançar exceções.
  • Uma vez que uma exceção ocorre no try bloco, o fluxo de controlo salta para o primeiro manipulador de exceções 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 não houver um manipulador de exceções para uma determinada exceção, o programa deixa de executar com uma mensagem de erro.
  • Não apanhe uma exceção a menos que consiga lidar com isso e deixar o pedido num estado conhecido. Se apanhar System.Exception, reencasse-a utilizando a throw palavra-chave no fim do catch bloco.
  • Se um catch bloco definir uma variável de exceção, 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 utilizando a throw palavra-chave.
  • Os objetos de exceção contêm informações detalhadas sobre o erro, tais como o estado da pilha de chamadas e uma descrição de texto do erro.
  • O código num finally bloco é executado independentemente de se uma exceção for lançada. Utilize um finally bloco para libertar recursos, por exemplo, para fechar quaisquer streams ou ficheiros que foram abertos no try bloco.
  • As exceções geridas em .NET são implementadas em cima do mecanismo de tratamento de exceções estruturado Win32. Para obter mais informações, consulte o Manuseamento estruturado de exceções (C/C++) e um curso de colisão nas profundezas do manuseamento de exceções estruturadas Win32.

Especificação linguística C#

Para mais informações, consulte As Exceções na Especificação de Idioma C. A especificação linguística é a fonte definitiva para a sintaxe e utilização C#.

Ver também