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
Referências: