2

C# - EXCEÇÃO. E AGORA?

#.NET C#
Mauricio Cruz
Mauricio Cruz

Ao trabalhar com a maioria das linguagens de programação, um dos recursos que precisamos estar atentos é o Tratamento de Exceções.


"O tratamento de exceção, na ciência da computação, é o mecanismo responsável pelo tratamento da ocorrência de condições que alteram o fluxo normal da execução de programas de computadores." *


Quem nunca viu aparecer um erro esquisito quando, por exemplo, tentamos converter uma letra em um número inteiro? Quando isso acontece, dizemos que "Estourou uma Exceção".


Em C#, o código abaixo estoura uma exceção e interrompe o programa caso o usuário digitar, por exemplo, a letra "a":

using System;

class ArtigoExcecao1 {
 static void Main() {
   Convert.ToInt32(Console.ReadLine());
   Console.WriteLine("Programa chegou até aqui!");
 }
}

A mensagem de erro será algo do tipo:

Unhandled Exception:                                                                                
System.FormatException: Input string was not in a correct format.                                   
 at System.Number.StringToNumber (System.String str, System.Globalization.NumberStyles options, Syst
em.Number+NumberBuffer& number, System.Globalization.NumberFormatInfo info, System.Boolean parseDecim
al) [0x00057] in <65984520577646ec9044386ec4a7b3dd>:0 ...
Observação: Para simulação dos exemplos estou usando o compilador on line OnlineGDB Beta (https://www.onlinegdb.com/).


Esse conjunto grande de informações é conhecido como "Stack Trace", que não irei abordar profundamente aqui. Mas algo importante está no começo da mensagem, nas primeiras linhas. O compilador nos avisa que há uma exceção "não tratada" (unhandled) do tipo "erro de formatação" (FormatException):

Unhandled Exception:                                                                                

System.FormatException: Input string was not in a correct format.  

Isso significa que a entrada do usuário (letra "a") gerou uma exceção do tipo "FormatException" ao tentar ser convertida para um valor inteiro (Convert.ToInt32()).


TRATANDO EXCEÇÕES


O que podemos fazer para usar as exceções ao nosso favor?


Infelizmente não conseguimos "prever" TODOS os erros que podem acontecer durante a execução do código. Porém, dependendo do que estamos codificando no momento, já conseguimos ter uma ideia de algumas exceções que podem ocorrer.


As exceções mais comuns em C# são **:

IndexOutOfRangeException: Gerada pelo runtime somente quando uma matriz é indexada incorretamente.

NullReferenceException: Gerada pelo runtime somente quando um objeto nulo é referenciado.

InvalidOperationException: Gerada por métodos quando em um estado inválido.

ArgumentException: A classe base para todas as exceções de argumento.

ArgumentNullException: Gerada por métodos que não permitem que um argumento seja nulo.

ArgumentOutOfRangeException: Gerada por métodos que verificam se os argumentos estão em um determinado intervalo.


No caso do exemplo mais acima, podemos testar e tomar decisões mais específicas caso ocorra uma exceção.

Para testar uma exceção - dizemos "Tratar uma exceção" - usamos a estrutura try .. catch, que "captura" a exceção para que possamos decidir como continuar a execução do programa.


Por exemplo, ao invés de exibir o "stack trace", podemos mostrar para o usuário uma mensagem mais agradável:


using System;
class ArtigoExcecao1 {
 static void Main() {
   try {
       Convert.ToInt32(Console.ReadLine());
      Console.WriteLine("Programa chegou até aqui!");
   }
   catch {
       Console.WriteLine("Erro na entrada de dados!");
   }
 }
}

o resultado seria:

a                                                                                                    
Erro na entrada de dados!                                                                            
                                                                                                     
                                                                                                     
...Program finished with exit code 0                                                                 
Press ENTER to exit console.

 

MUITO CUIDADO!


A partir do momento que você captura uma exceção, a sequência de execução do seu programa fica sob sua responsabilidade. Ou seja, o programa continuará rodando, como se não tivesse acontecido nenhum erro.

Imagine o impacto do seguinte código em um programa:


using System;
class HelloWorld {
 static void Main() {
   try {
       Convert.ToInt32(Console.ReadLine());
   }
   catch {
   }
 }
}

A exceção foi capturada e simplesmente ignorada.


O tratamento de exceções é uma parte importante no desenvolvimento de código e devemos estar sempre atento a ele. Podemos, inclusive, utilizá-lo ao nosso favor, mas isso é tema para um outro artigo!


* - Tratamento de exceção - Wikipedia - https://pt.wikipedia.org/wiki/Tratamento_de_exce%C3%A7%C3%A3o
** - Tratando e gerando exceções no .NET - Microsoft Docs - https://docs.microsoft.com/pt-br/dotnet/standard/exceptions/
2
31

Comentários (2)

1
José Júnior

José Júnior

11/03/2021 18:37

Muito bom e didático, obrigado!

1
Cyro Cunha

Cyro Cunha

11/03/2021 16:57

excelente explicação, muito exclarecedor!

Analista de Sistemas, apaixonado pela família e por Caratê

Brasil