Tratando Exceções

 

Neste artigo veremos como tratar exceções que por ventura venham a aparecer nos seus programas. Todo bom desenvolvedor sabe que seus programas jamais devem travar, sendo assim é primordial em qualquer programa que se tenha total atenção em certas partes do seu código que algum tipo de travamento ou mensagem de erro venha a aparecer.

                                            

Introdução

O Framework .Net ao receber algum tipo de exceção imediatamente irá tratar a exceção ocorrida pelo seu código, felizmente para os programadores. Mas sabemos que esse não é o melhor método de comunicar a um usuário o que pode ter ocorrido para de repente aparecer na tela uma mensagem avisando de uma exceção. O Framework .Net apresenta, ao receber alguma exceção, mensagens em inglês e que normalmente um usuário que esta adquirindo o seu produto não irá entender.


Assim fica mais do que claro que devemos tratar essas exceções que por ventura poderão ocorrer, procurando sempre apresentar uma mensagem mais original e em nossa língua nativa para que o usuário possa entender o problema e tentar resolver, ou então avisar ao dono do produto para assim resolver o problema ocorrido.


Devemos salientar que o mecanismo de tratamento de exceções, realizado através de exceptions, do é considerado hoje o mais moderno que existe.
Portanto se não tratarmos as exceções em nossos códigos, o Framework .Net irá imediatamente acionar uma rotina da biblioteca do C# para tratar a exceção ocorrida.

 

Exemplificando uma exceção

Para termos uma primeira idéia de como podemos tratar uma possível exceção, exemplificamos uma das exceções mais comuns que ocorrem.

 

int num = 0;

try

{

      num = Convert.ToDecimal(num);

      num = 1/num;

}

catch(DivideByZeroException)

{

      MessageBox.Show(“Não existe divisão por Zero!”);

}

Listagem 01. Tratando divisão por zero.

 

 

Principais Classes de Exceções

A seguir listarei as principais classes de exceções que você provavelmente irá utilizar em seus programas.

 

Exceção

Quando será disparada a exceção.

System.OutOfMemoryException

Falha na alocação de memória.

System.StackOverflowException

Falha quando a pilha estiver cheia.

System.NullReferenceException

Falha quando uma referência null é utilizada indevidamente.

System.TypeInitializationException

Falha quando um construtor estático dispara uma exceção.

System.InvalidCastException

Falha em tempo de execução devido a uma conversão explícita indevida.

System.ArrayTypeMismatchException

Falha devido a um armazenamento inválido dentro de um array.

System.IndexOutOfRangeException

Falha quando o índice do array é menor que zero ou fora do limite.

System.MulticastNotSupportedException

Falha quando as combinações de dois delegates não nulos acusam falhas

System.DivideByZeroException

Falha quando ocorre uma divisão por zero.

System.OverflowException

Falha quando ocorre um overflow numa operação aritmética.

 

Try ... catch

Basicamente o comando try recebe comandos que causam erro e o comando catch recebe um possível tratamento para o erro gerado.

 

Exemplificando Try ... catch

Acompanhe o exemplo abaixo onde teremos uma exceção da classe System.DivideByZeroException.

 

using System;

class Exemplo {

      public static int Main()

      {

         int n = 10;

         int x = 0;

         int r;

         try

         {

            r = n / x; //aqui temos uma exceção, divisão por zero

         }

         catch(System.DivideByZeroException e)

         {

            Console.WriteLine(“Uma exceção ocorreu! Sua decisão:”);

            Console.WriteLine(e);

            Console.WriteLine(“”);

            r = 0;

         }

         Console.WriteLine(“O resultado da divisão “ +r.ToString());

         return 0;

      }

}

 

Listagem 02. Tratando exceção com o bloco de comando try/catch.

 

 

Try ... Catch ... Finally

Basicamente o comando try recebe comandos que causam erro, o comando catch recebe um possível tratamento para o erro gerado e a novidade nesta seção é o comando Finally que se trata de uma possível liberação de recursos.

                                              

Exemplificando Try ... catch ... Finally

Acompanhe o exemplo abaixo onde teremos uma exceção da classe System.DivideByZeroException.

 

using System;

class Exemplo {

      public static int Main()

      {

         int n = 10;

         int x = 0;

         int r = 0;

         try

         {

            r = n / x; //aqui temos uma exceção, divisão por zero

         }

         catch(System.DivideByZeroException e)

         {

            Console.WriteLine(“Uma exceção ocorreu! Sua decisão:”);

            Console.WriteLine(e);

            Console.WriteLine(“”);

            r = 0;

         }

         finally

         {

            Console.WriteLine(“O resultado da divisão “+r.ToString());

         }

         return 0;

      }

}

Listagem 03. Tratando exceção com o bloco de comando try/catch/finally.

                   

Vale salientar que o bloco finally, ao ocorreu uma exceção, sempre será executado, isso é muito importante em casos em que estivermos trabalhando com arquivos, onde após ocorreu uma exceção o arquivo deverá ser fechado, ou a aplicação será encerrada e o arquivo continuará aberto podendo causar graves erros para a aplicação.

 

Problemas com Try ... catch ... Finally

Em alguns casos os arquivos voltam a mostrar um grave erro no bloco Try/catch/finally. O bloco foi alvo de comentário do próprio criador da linguagem C#. Anders, criador do C#, em entrevistas recentes à jornais disse que apenas aceitou adotar os três blocos juntos devido à pedidos dos programadores por todas as parte do planeta. Anders, questiona seriamente o uso dos três comandos.

 

Para exemplificar isto, veja o código abaixo.

 

System.IO.StreamReader Arq = null;

try

{

   Arq = new System.IO.StreamReader(textBox3.Text);

   listBox1.Items.Clear();

   while(Arq.Peek() != -1)

   {

      listBox1.Items.Add(Arq.ReadLine());

   }

}

catch(System.IO.IOException)

{

   MessageBox.Show(“Erro na abertura do arquivo”);

}

finally

{

   Arq.Close();

}

Listagem 04. Problema com o bloco try/catch/finally.

                    

Agora com este exemplo podemos observar o grande problema que temos nesse código. Primeiramente o aplicativo tentará abrir o arquivo e não conseguirá, assim irá gerar uma exceção que será trata pelo bloco catch e posteriormente o bloco finally tentará fechar o arquivo, que não foi aberto. Assim problemas muito graves irão ocorrer, podendo inclusive travar o sistema.

 

Conclusão

Vimos neste artigo mais uma grande qualidade do C Sharp que são os tratamentos de exceções, que é uma técnica muito usada hoje pelos desenvolvedores. Mas também devemos ter muito cuidado com os problemas que poderão ocorrer caso não seja bem usada.

 

Agradeço aos pedidos dos visitantes por mais um artigo que espero ter finalizado com sucesso e ter sido de total entendimento de todos e continuem enviando sugestões e dúvidas.