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
, catch
e 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#, acatch
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 athrow
palavra-chave no fim docatch
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 umfinally
bloco para libertar recursos, por exemplo, para fechar quaisquer streams ou ficheiros que foram abertos notry
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#.