Assina meu Feed ai!
Google
 


11 outubro 2006

Tratamento de erros no C# - Try, Catch e Finally

Introdução

Qualquer um que já foi um simples usuário de software já se deparou com uma mensagem de erro na sua frente, alguns softwares tem mensagens que só ajudam o desenvolvedor, alguns só o usuário e outros tem mensagens que não ajudão em nada! O tratamento de erros consiste em interceptar esses erros a fim de que o programa não aborte inesperadamente e informe ao usuário o que está errado. Meu objetivo é dar uma base de como tratar esses erros no C# e vou tentar usar uma linguagem simples para quem não é muito habituado com programação.

Usando Try, Catch e Finally

No .NET esses erros são chamados exceções (ou exceptions) e são tratados com as instruções try, catch e finally. Para tratar as exceções definimos um bloco do código que o .NET irá "tentar" (try) executar, se algo der errado ele vai executar o que estiver num bloco especifico(catch) que contem o que fazer numa situação dessas. Nesse bloco normalmente agente dispara alguma mensagem do tipo "O comando não pode ser executado", que alias é um exemplo de mensagem que não ajuda em muita coisa mas serve por enquanto. Também é possível criar um bloco que será executado dando erro ou não (finally).

Resumindo:
try - Define o bloco que contem a execução normal do código;
catch - Define o bloco com o código que será executado caso ocorra alguma exceção no bloco try. Digamos que esse é o tratamento dos erros em si.
finally (opcional) - Define o bloco que será executado independente de haver exceções ou não!

Na prática

Abaixo tem o código de um botão de um form qualquer que tem por objetivo calcular a área de um triangulo, para isso digamos que o form tem dois textbox um chamado txtBase e outro chamado txtAltura para recolher essas informações.

int Base = Int32.Parse(txtBase.Text);
int Altura = Int32.Parse(txtAltura.Text);
int Area = Base * Altura / 2;
MessageBox.Show("Área = " + Area);
O código acima funciona perfeitamente mas não prevê erros. Se por acaso clicarmos no botão com o campo vazio ou letras no lugar de números o programa vai exibir uma mensagem padrão do .NET indicando que ocorreu uma exceção e interrompe o método do botão.

Agora veja o código com tratamento de erro simples. Nesse caso, se ocorrer algo errado ele exibe a mensagem "Por favor informe corretamente a base e a altura" no lugar da mensagem de erro padrão do .NET.
try{ // Tenta executar esse bloco de código
int Base = Int32.Parse(txtBase.Text);
int Altura = Int32.Parse(txtAltura.Text);
int Area = Base * Altura / 2;
MessageBox.Show("Área = " + Area);
}
catch{ // Em caso de erro, executa esse bloco no lugar da mensagem padrão do .NET
MessageBox.Show("Por favor informe corretamente a base e a altura");
}

Exemplo de finally
Vamos imaginar que a gente queira limpar o conteúdo dos textbox mesmo se der erro, basta adicionar um bloco finally com o código correspondente, assim:try{ // Tenta executar esse bloco de código
int Base = Int32.Parse(txtBase.Text);
int Altura = Int32.Parse(txtAltura.Text);
int Area = Base * Altura / 2;
MessageBox.Show("Área = " + Area);
}
catch{ // Em caso de erro, executa esse bloco no lugar da mensagem padrão do .NET
MessageBox.Show("Por favor informe corretamente a base e a altura");
}
finally{ // Esse sempre será executado
txtBase.Clear();
txtAltura.Clear();
}

É isso por enquanto, deixem sua opiniões! ;)

Fonte de consulta: Desenvolvendo com C# - Fabio Galuppo, Vanclei Matheus, Wallace Santos - Ed. Bookman

14 comments:

leandro disse...

eh issu ai uso linguagem simples e ta certinho!!

flw

Renato (Zoinho) disse...

Muito bom, continue assim e seu blog vai se tornar uma otima fonte de informações ... xD

Luiz disse...

Muito bom, explicou curto e grosso sem ficar enrolando ou mostrando exemplos complexos, explicação de facil entedimento, parabens!

Anônimo disse...

obrigado mesmo, ajudou imenso num trabalho!

leandro.dcp disse...

isso ai cara, ajudou bastante.

Malcomtux disse...

Valeu pessoal! Que bom que ajudei!

Hoje meu blog está menos tecnico mas eu estou planejando outro para tratar desses assuntos!

vini disse...

muito bom!! é disso que nos iniciantes precisamos... continue preciso e eficaz. Zinabre MMAVALETUDO

Malcomtux disse...

Obrigado Vini

Junior disse...

Me ajudou muito essa informação!

Aline Bossi disse...

Olá, estava mesmo procurando um artigo como este para esclarecer algumas dúvidas sobre os tratamentos de erro. O seu artigo está ótimo.
Parabéns!

Anônimo disse...

great share, great article, very usefull for me...thank

you

Silvio disse...

Estou quebrando a cabeça aqui tentando utilizar try catch nesse trecho de código:

for (int i = 0; i < 1000; i++)
{
r = rand.Next(0, 1000);
try
{
Console.Write(myarray[i] + ", ");
myarray.RemoveAt(i);
}

catch (IndexOutOfRangeException)
{
Console.Write("[e " + r + "]");
}
}

Sendo que é esperado dar indice errado, mas ele trata como unhandled a exceção IndexOutOfRangeException. Alguém tem alguma idéia?

Anônimo disse...

Bom tópico, bem explicado e sem redundâncias, grato.

Anônimo disse...

Bom tópico, Parabéns, muito bem explicado.