Tratando e gerando exceções no .NET

Aplicativos devem ser capazes de tratar de erros que ocorrem durante a execução de uma maneira consistente. O .NET fornece um modelo para notificar aplicativos sobre erros de maneira uniforme: operações do .NET indicam falhas por meio da geração de exceções.

Exceções

Uma exceção é qualquer condição de erro ou comportamento inesperado encontrado por um programa em execução. Exceções podem ser geradas devido a uma falha em seu código ou no código que você chama (como uma biblioteca compartilhada), recursos do sistema operacional não disponíveis, condições inesperadas encontradas pelo runtime (como código que não pode ser verificado) e assim por diante. Seu aplicativo pode se recuperar de algumas dessas condições, mas não de outras. Embora você possa se recuperar da maioria das exceções de aplicativo, não é possível recuperar-se da maioria das exceções de runtime.

No .NET, uma exceção é um objeto herdado da classe System.Exception. Uma exceção é lançada de uma área do código em que ocorreu um problema. A exceção é passada pilha acima até que o aplicativo trate dela ou o programa seja encerrado.

Métodos de tratamento de exceção vs. tratamento de erro tradicional

Tradicionalmente, o modelo de tratamento de erro da linguagem confiava na forma exclusiva da linguagem de detectar erros e localizar manipuladores para eles ou no mecanismo de tratamento de erro fornecido pelo sistema operacional. A maneira como o .NET implementa o tratamento de exceção oferece as seguintes vantagens:

  • O lançamento e tratamento de exceção funciona da mesma maneira para linguagens de programação .NET.

  • Não requer nenhuma sintaxe de linguagem específica para tratamento de exceção, mas permite que cada linguagem defina sua própria sintaxe.

  • Exceções podem ser geradas pelos limites de processo e até mesmo de computador.

  • O código de tratamento de exceção pode ser adicionado a um aplicativo para aumentar a confiabilidade do programa.

As exceções oferecem vantagens sobre outros métodos de notificação de erro, como códigos de retorno. Falhas não passam despercebidas porque se uma exceção for lançada e você não tratar dela, o runtime encerra o aplicativo. Valores inválidos não continuam a se propagar através do sistema como resultado do código que não consegue verificar se há um código de retorno de falha.

Exceções comuns

A tabela a seguir lista algumas exceções comuns com exemplos do que pode causá-las.

Tipo de exceção Descrição Exemplo
Exception A classe base para todas as exceções. Nenhuma (use uma classe derivada dessa exceção).
IndexOutOfRangeException Gerada pelo runtime somente quando uma matriz é indexada incorretamente. Indexar uma matriz fora do intervalo válido:
arr[arr.Length+1]
NullReferenceException Gerada pelo runtime somente quando um objeto nulo é referenciado. object o = null;
o.ToString();
InvalidOperationException Gerada por métodos quando em um estado inválido. Chamar Enumerator.MoveNext() após a remoção de um item da coleção subjacente.
ArgumentException A classe base para todas as exceções de argumento. Nenhuma (use uma classe derivada dessa exceção).
ArgumentNullException Gerada por métodos que não permitem que um argumento seja nulo. String s = null;
"Calculate".IndexOf(s);
ArgumentOutOfRangeException Gerada por métodos que verificam se os argumentos estão em um determinado intervalo. String s = "string";
s.Substring(s.Length+1);

Confira também