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-chavecatch
é 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-chavethrow
no final do blococatch
. - 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 blocofinally
para liberar recursos, por exemplo, para fechar todos os fluxos ou arquivos que foram abertos no blocotry
. - 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#.