Programação
Orientada à
Objetos
Aula 16- Tratamento de
Exceções
ADO.NET – Tratando Exceções
(Erros)
Qualquer pessoa que já foi um simples usuário de uma
aplicação já se deparou com alguma mensagem de erro
na sua tela.
Algumas aplicações não tratam tais erros (exceções) de
forma correta e deixam que os usuários recebam
mensagens que só são entendidas pelo programador - e
que não ajudam em nada o usuário.
O tratamento de exceções consiste em interceptar esses
erros fim de que o programa não aborte inesperadamente
e ainda, consiga informar ao usuário o que está errado.
ADO.NET – Tratando Exceções
(Erros)
No C# as exceções (ou exceptions) são tratadas com as
instruções try, catch e finally.
A idéia consiste em proteger um bloco de código com o try e,
caso ocorra algum erro, a exceção gerada será capturada
pelo bloco catch.
Dentro do bloco catch geralmente exibimos uma mensagem
(MessageBox) para o usuário, explicando-lhe que houve um
erro.
Caso seja necessário sempre executar uma determinada
ação (código) ao final, não importando se foi OK ou se deu
algum erro, inserimos tal código num bloco finally.
ADO.NET – Tratando Exceções
(Erros)
Resumindo:
• try - define o bloco que contem a execução normal
do código;
• catch - define o bloco com o código que será
executado caso ocorra alguma exceção dentro do
bloco protegido pelo try. Aqui é feito o tratamento
de erros;
• finally (opcional) - define o bloco que será
executado independentemente
se ocorreu uma exceção ou não.
ADO.NET – Tratando Exceções
(Erros)
Na prática:
A seguir a interface e o código de um formulário
que tem por objetivo calcular a área de um
triângulo:
ADO.NET – Tratando Exceções
(Erros)
Evento click do botão
ADO.NET – Tratando Exceções
(Erros)
O código acima funciona perfeitamente mas não
prevê erros.
Se por acaso clicarmos no botão com os campos
vazios ou letras no lugar de números o programa
vai exibir uma mensagem padrão do .NET,
indicando que ocorreu uma exceção e o código
será interrompido.
ADO.NET – Tratando Exceções
(Erros)
A mensagem padrão de erro será parecida com esta:
O que o usuário irá pensar ao ver esta mensagem?!? :(
ADO.NET – Tratando Exceções
(Erros)
Agora vejamos o código com tratamento de erro
simples. Nesse caso, se ocorrer algo errado uma
mensagem mais amigável será exibida no lugar
da mensagem de erro padrão do .NET.
ADO.NET – Tratando Exceções
(Erros)
Agora, se o usuário não informar os dados e clicar
no botão, a mensagem que será exibida será
assim:
ADO.NET – Tratando Exceções
(Erros)
Exemplo do finally
Vamos imaginar que a gente queira limpar o
conteúdo dos textBox ao final, não importando se
deu certo ou se deu erro.
Para isso, basta adicionar um bloco finally com o
código correspondente.
A seguir o código completo com a instrução finally:
ADO.NET – Tratando Exceções
(Erros)
ADO.NET – Tratando Exceções
(Erros)
Exercício 1
Agora crie um projeto chamado
ProjTratamentoExcecao e reproduza o exemplo
citado anteriormente (ou similar). Execute e teste
sua aplicação.
ADO.NET – Tratando Exceções
(Erros)
Quando
trabalhamos com BD as
exceções geralmente ocorrem em dois
momentos:
1. Ao tentar conectar com o BD;
2. Ao executar um comando SQL.
ADO.NET – Tratando Exceções
(Erros)
Os erros que ocorrem na hora da conexão com o
BD frequentemente estão associados a:
• String de conexão inválida (errada).
• Servidor de BD não existe ou não está acessível.
• Falha no login (usuário e/ou senha inválidos).
Já os erros mais comuns quando tentamos
executar um comando SQL são:
• Sintaxe incorreta do comando SQL (SELECT, UPDATE,
INSERT e DELETE).
• Nome da tabela ou coluna incorretos.
ADO.NET – Tratando Exceções
(Erros)
Vimos
também que podemos tratar os
erros ocorridos na aplicação através da
estrutura try..catch..finally.
Agora
vamos aprender um pouco mais
sobre as exceções em .NET.
ADO.NET – Tratando Exceções
(Erros)
Toda exceção lançada por um programa
em .NET pertence à classe Exception
(System.Exception).
Isto significa que a classe de uma exceção
sempre será System.Exception ou uma de
suas
sub-classes,
por
exemplo,
FormatException ou DivideByZeroException.
ADO.NET – Tratando Exceções
(Erros)
Vamos
criar uma aplicação para ficar
mais claro. Crie o projeto
ProjTratamentoExcecoes e configure o
formulário principal da forma ilustrada a
seguir:
ADO.NET – Tratando Exceções
(Erros)
Este programa irá receber a base e a altura de
um triângulo e então calcular e exibir a sua área
em um MessageBox.
Digite o código a seguir no evento Click do
botão:
ADO.NET – Tratando Exceções
(Erros)
Perceba que a principal diferença entre o
tratamento de erro usado aqui e o do exemplo
anterior está no bloco catch, onde agora
definimos a variável erro da classe Exception para
que possamos acessar as informações do erro
originado pelo .NET.
O comando erro.Message irá retornar a
mensagem de erro original, já o erro.GetType()
retornará a classe da exceção gerada.
ADO.NET – Tratando Exceções
(Erros)
Se
agora executarmos nossa aplicação e
clicarmos no botão sem preencher
qualquer
campo,
receberemos
a
seguinte mensagem:
ADO.NET – Tratando Exceções
(Erros)
Perceba que além de exibirmos a mensagem
padrão ("Ocorreu um erro ao calcular a área"),
temos outras informações: a mensagem de erro
originado
pelo
.NET
e
a
sua
classe
(FormatException).
Agora outro teste. Se digitarmos valores muito
grandes nos campos e clicarmos no botão a
mensagem será:
ADO.NET – Tratando Exceções
(Erros)
Veja como mudaram a mensagem original e a classe da
exceção (OverflowException).
Tanto FormatException como OverflowException são subclasses da classe Exception.
A seguir um diagrama de classes UML para ilustrar melhor essa
hierarquia de classes de exceções:
ADO.NET – Tratando Exceções
(Erros)
Perceba que toda exceção possui uma classe ancestral em comum, a
classe Exception.
Através desta hierarquia podemos refinar/melhorar nossas mensagens
de erro para o usuário. Podemos, por exemplo, exibir a mensagem
"Digite apenas números para os campos" quando a classe da exceção
for FormatException.
E a mensagem "Valor informado está muito grande" quando a classe for
OverflowException. E ainda, exibir a mensagem padrão "Ocorreu um
erro ao calcular a área" no caso de qualquer outra exceção.
Fazemos isso inserindo vários blocos catch – um para cada exceção
que desejamos capturar e tratar separadamente. Veja o código de
exemplo:
ADO.NET – Tratando Exceções
(Erros)
ADO.NET – Tratando Exceções
(Erros)
Uma coisa importante a observar neste código é que, os blocos
catch mais específicos (FormatException e OverflowException)
devem ser digitados antes dos mais genéricos (Exception).
Mas não se preocupe, se não tomarmos este cuidado, o
compilador irá nos avisar exibindo uma mensagem de erro ao
compilarmos o nosso programa.
Como todas as exceções são classes elas possuem propriedades e
métodos. Message é uma propriedade que nos informa a
mensagem original do .NET e GetType() é um método que nos
retorna a classe da exceção.
Tanto Message como GetType() estão implementados na classe
Exception e, portanto, estão acessíveis em todas as suas subclasses.
ADO.NET – Tratando Exceções
(Erros)
A exceção SqlException
Uma classe de exceção que muito nos interessa quando trabalhamos com acesso
ao BD é a SqlException. Além das propriedades herdades de Exception ela possui
outras, dentre elas podemos citar:
• Number : informa o código interno do erro no BD. Cada erro lançado por
um SGBD possui um código interno – estes códigos são diferentes para cada SGDB
(MS SQL Server, Oracle, Postgres etc);
• LineNumber : informa a linha do comando SQL onde ocorreu o erro.
Com estas propriedades, podemos tratar as mensagens lançadas pelo BD, que são
as exceções da classe SqlException, através do seu código e ainda informar qual a
linha onde ocorreu o erro.
ADO.NET – Tratando Exceções
(Erros)
Vamos a um exemplo prático.
Abra o MS SQL Server Management Studio. Na tela inicial
(onde informamos o servidor, usuário e senha) digite um
servidor que não existe, por exemplo "teste123" e clique no
botão 'Connect'. Receberemos então uma mensagem
gerada pelo SGDB a qual conterá seu código interno, veja a
imagem do erro:
ADO.NET – Tratando Exceções
(Erros)
Percebam no destaque que o código interno do erro gerado pelo SQL Server
foi 53. Podemos recuperar este código no C# e exibir uma mensagem de
erro mais amigável para o usuário dessa forma:
ADO.NET – Tratando Exceções
(Erros)
Exercício 2
Baseando-se no exemplo anterior, insira um tratamento de
exceções adequado no projeto da aula anterior (ou similar)
para que, ao clicar no botão 'Conectar ao BD', sejam tratadas
as exceções de: servidor inválido, banco de dados inválido e
usuário/senha inválidos. Como parte deste exercício, você
terá que descobrir os códigos dos respectivos erros e
implementá-los na sua aplicação.
Dúvidas?