C# - Tratamento de exceções - I
  Neste artigo vamos recordar conceitos importantes relacionados ao tratamento de erros na linguagem C# .


Quando estamos criando um projeto a nem tudo vai funcionar conforme o esperado mesmo se tomarmos todos os cuidados e seguirmos as boas práticas. Inevitavelmente, podemos encontrar erros como resultado de algumas operações e, para detectar esses erros, precisamos conhecer e aplicar o conceito de Tratamento de Exceções.
 

 

 

Portanto, neste artigo, irei abordar como ocorre o Tratamento de Exceções ou Error Handling e quais tipos de erros estão presentes.

 

 

Durante o desenvolvimento de um projeto é possível encontrar erros relacionados ao usuário que ocorrerão devido à lógica, sistema ou dados que recebemos do usuário. Para tornar nosso programa uma estrutura segura para tais situações, precisamos pegar, por assim dizer, caçar esses erros que aparecerão.

Um cenário comum no qual erros podem ocorrer e devem ser localizados e tratados é quando precisamos acessar uma pasta, um site ou estabelecer uma conexão com o banco de dados. Neste cenários pode ocorrer que o caminho do arquivo que desejamos acessar foi alterado, ou a conexão com a internet caiu as informações de nosso banco de dados podem estar incorretas. Nesses casos, como nosso programa nos enviará um erro, queremos capturar esse erro e realizar as operações necessárias em uma estrutura segura.

Esses tipos de erros que podemos encontrar são divididos em três títulos principais na literatura. Vamos dar uma olhada nesses tipos de erro para que possamos entender melhor o problema.

 

C# : Tipos de Erro

 

Existem várias estruturas de exceção contidas em três títulos gerais que podemos adotar em diferentes de cenários.

1- Checked Exception : Esse tipo de ocorre quando nosso programa nos pede para criar algumas estruturas usando blocos try-catch porque ele prevê que alguns erros podem ocorrer. Qualquer erro desse tipo é chamado de “Exceção Verificada” na literatura. Por exemplo, quando queremos acessar um arquivo em nosso programa, nosso programa nos pedirá para usar um IOException.


2- Unchecked Exception : Ao contrário das estruturas Checked Exception, neste tipo de erro, o nosso programa não nos obriga a criar uma estrutura “try-catch” porque não pode prever que a operação que queremos realizar irá gerar um erro. Exemplos desse tipo de erro são as estruturas RuntimeException, ArithmeticException.
 

3- Error : Este tipo de erro são erros como StackOverFlow, OutOfMemory que podem ocorrer durante a operação do programa, é um cenário que a maioria das pessoas não deseja encontrar, pois às vezes teremos que recriar o programa.

Agora, já temos uma ideia sobre os "tipos de erros" que podemos encontrar, e podemos passar para o estágio de reconhecimento das estruturas de blocos try-catch que vamos capturar esses tipos de erro.

 

Caçando erros com try-catch


Podemos usar o bloco try-catch para nos ajudar a capturar erros que sabemos que podem ocorrer em um código que estamos criando.

 

Vamos examinar a estrutura deste bloco :

 

Bloco Try  : Neste bloco vamos escrever os trechos de código que achamos que causarão um erro durante a execução. Em outras palavras, esse bloco detecta os erros que ocorrerão para nós e executa e pula para o bloco catch para evitar que nosso programa falhe.

Bloco Catch : Depois que o erro capturado no bloco try é direcionado para os blocos catch relevantes, nosso bloco catch executa os trechos de código que criamos para o cenário de resolução de erros.

Bloco Finally : É o bloco no qual vamos escrever o código que vai funcionar em todas as condições, seja encontrado um erro no bloco try ou não. Este bloco pode ou não ser usado ou não adicionar às nossas estruturas de bloco try-catch.

 

Agora, vamos aprender como capturar e lidar com os erros que encontramos, para isso vamos criar um exemplo simples e aprender a usar os blocos try-catch no código.

Vamos usar uma aplicação console chamada CShp_TrataErros criada no ambiente do .NET 6 no Visual Studio 2022.

 

Nesta aplicação vamos escrever um código onde podemos obter o erro 'ArithmeticException' e ver como capturar e tratar o erro.

 

A seguir temos o código na classe Program:

 

Ao executar o projeto no modo Debug iremos obter o seguinte erro: System.DivideByZeroException.

 

 

Vamos então usar o bloco try-catch e prevendo esse erro vamos considerar realizar um tratamento que deve ocorrer para quando o valor de b for igual a zero.

 

Assim a linha de código que pode causar o erro vai ser colocada no bloco try e o tratamento para o erro será colocado no bloco catch :

 

 

Observe que optamos por fazer um tratamento para evitar o erro da divisão por zero alterando o valor de a e b quando eles forem zero. Isso funciona mas podemos realizar um tratamento sem alterar valores obtendo o erro e identificando as suas origens e como ele ocorre.

 

C# -  Métodos de exceção

 

Existem vários métodos para o tratamento de exceções que podemos usar em estruturas de erro derivadas da classe System.Exception. Esses métodos geralmente são funções que nos ajudam, dando uma ideia de onde e como ocorrem os erros em nossos projetos.

 

Os principais são :

Message(): É um método que retorna uma mensagem descritiva relevante sobre o erro capturado nos blocos Try-Catch.

Source(): Define o  nome do aplicativo ou arquivo para o qual o objeto de exceção é enviado.

StackTrace(): Informa sobre o método ou programa onde ocorreu o erro e agiliza o processo de solução.

TargetSite():  Informa o método que causou a exceção;

InnerException(): É uma função que será executada como resultado da captura de erros, caso ocorra um erro em nosso bloco “Catch”;

ToString(): Retorna todo o texto da estrutura de erro resultante como um array;

Vamos usar esses métodos para o nosso exemplo definindo no bloco catch o código a seguir:

 

 

Executando o código iremos obter:
 



Temos agora informações importantes que podemos usar para identificar a origem e a localização do erro e como realizar um tratamento mais apurado.

 

Vamos a seguir alterar o exemplo e realizar o tratamento de exceções considerando agora a entrada do valor de a e b pelo usuário e prevendo as possíveis causas de erro que podemos ter.

 

Neste caso podemos ter o erro de divisão por zero definido pela classe DivideByZeroException, o erro de formatação quando o usuário informar um valor que não seja um inteiro capturado pela classe FormatException e o erro genérico capturado pela classe Exception.

 

Assim podemos definir o código para tratar essas exceções previstas conforme abaixo:

 

 

Executando o projeto e simulando um erro de entrada de valores incorretos teremos o seguinte resutado:

 

 

Naturalmente poderíamos considerar realizar outro tipo de tratamento dependendo do cenário da execução do código.

 

Esses seriam os fundamentos para realizar o tratamento de erros básico na linguagem C#.

 

Pegue o projeto aqui :  CShp_TrataErros.zip (sem as referências)...

 

"Porque o Filho do homem(Jesus) veio buscar e salvar o que se havia perdido."
Lucas 19:10
  

Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6
Porque um menino nos nasceu, um filho se nos deu, e o principado está sobre os seus ombros, e se chamará o seu nome: Maravilhoso, Conselheiro, Deus Forte, Pai da Eternidade, Príncipe da Paz.

Isaías 9:6

Referências:


José Carlos Macoratti