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!
José Júnior
11/03/2021 18:37