IX10-ProgramacaoAvancada-Aula003

Transcrição

IX10-ProgramacaoAvancada-Aula003
PROGRAMAÇÃO
- CONTROLE
DE
AVANÇADA
EXCECAO
Prof. Angelo Augusto Frozza, M.Sc.
[email protected]
ROTEIRO
1.
Controle de Exceção
y
Introdução
y
Try – Finally
y
Try – Except
y
Try – Except com especificação de tipo de exceção
y
Classe de exceção
INTRODUÇÃO
Exceção é um objeto definido pelo tipo Exception
ou uma classe descendente;
| Sua função é trabalhar especificamente nos casos
de anormalidade que podem ocorrer na aplicação;
| Exemplo:
|
y
Se tentarmos acessar um índice não existente no
ListBox uma anormalidade é detectada pela exceção e
uma mensagem é mostrada;
INTRODUÇÃO
|
Para tratar exceções, o Delphi fornece as
cláusulas:
y
Try
y
Except
y
Finally
y
Raise
INTRODUÇÃO
|
Try
y
A cláusula Try é usada para iniciar um bloco que
pode gerar possíveis erros;
y
Se um erro ocorrer, o programa não será terminado;
y
Instantaneamente, o Try deixa de ser executado e dá
lugar a cláusula Except OU Finally;
y
Try pode ser usado em inúmeros trechos do código,
podendo até ser aninhado;
INTRODUÇÃO
procedure TForm1.btnTryFinallyClick(Sender: Tobject);
var
numero, zero: Integer;
begin
{Try – Usado para dividir um inteiro por zero
para gerar uma exceção }
numero := -1;
try
zero := 0;
numero := numero div zero;
ShowMessage(‘numero / zero =’ + IntToStr(numero));
finally
if numero = -1 then
begin
ShowMessage(‘Valor negativo identificado, ’
+ ‘ insira um valor válido!’) ;
numero := 0;
end;
end;
end;
INTRODUÇÃO
|
Except
y
A cláusula Except é usada para iniciar um bloco caso
uma exceção ocorra em Try;
y
Se o bloco que estiver em Except conter a exceção o
programa não será terminado;
INTRODUÇÃO
procedure TForm1.btnTryExceptFinallyClick(Sender: Tobject);
var
numero, zero: Integer;
begin
{Try – Usado para dividir um inteiro por zero
para gerar uma exceção }
try
zero := 0;
numero := 1 div zero;
ShowMessage(‘1 / zero =’ + IntToStr(numero));
except
on E: Exception do
begin
ShowMessage(E.ClassName +
+ ‘ erro gerado, com mensagem: ’ +
+ E.Message);
end;
end;
end;
INTRODUÇÃO
|
Finally
y
A cláusula Finally é usada para iniciar um bloco
havendo problemas ou não com a cláusula Try;
INTRODUÇÃO
procedure TForm1.btnTryFinallyClick(Sender: Tobject);
var
numero, zero: Integer;
begin
{Try – Usado para dividir um inteiro por zero
para gerar uma exceção }
numero := -1;
try
zero := 0;
numero := numero div zero;
ShowMessage(‘numero / zero =’ + IntToStr(numero));
finally
if numero = -1 then
begin
ShowMessage(‘Valor negativo identificado, ’
+ ‘ insira um valor válido!’) ;
numero := 0;
end;
end;
end;
INTRODUÇÃO
|
Raise
y
Gera uma exceção;
y
Permite que você possa levantar exceções no próprio
código quando ele descobrir dados inválidos ou
inconsistentes em tempo de execução;
y
Também pode ser utilizada dentro de uma rotina de
tratamento de exceção (cláusula Except) para
relevantar uma exceção, isto é, propagá-la para o
próximo handler;
TRY - FINALLY
try
// Trechos de código
finally
// Trechos de código
end;
TRY - FINALLY
procedure TForm1.btnTryFinallyClick(Sender: Tobject);
var
numero, zero: Integer;
begin
{Try – Usado para dividir um inteiro por zero
para gerar uma exceção }
numero := -1;
try
zero := 0;
numero := numero div zero;
ShowMessage(‘numero / zero =’ + IntToStr(numero));
finally
Depois que o código
if numero = -1 then
begin
em finally for
ShowMessage(‘Valor negativo identificado,
’ a exceção
executado
+ ‘ insira um valor válido!’)
não; tratada mostrará
numero := 0;
uma mensagem de
end;
erro.
end;
end;
TRY - EXCEPT
try
// Trechos de código
except
// Trechos de código
end;
TRY - EXCEPT
procedure TForm1.btnTryExceptClick(Sender: Tobject);
var
numero, zero: Integer;
begin
{Try – Usado para dividir um inteiro por zero
para gerar uma exceção }
try
zero := 0;
numero := 1 div zero;
ShowMessage(‘1 / zero =’ + IntToStr(numero));
except
ShowMessage(‘Erro desconhecido encontrado’) ;
end;
Quando o código em
end;
except for executado
será mostrada a
mensagem de erro
indicada.
TRY - EXCEPT
|
Variações do Except:
try
// Trechos de código
except
// Trechos de código
finally
// Trechos de código
end;
TRY - EXCEPT
|
Variações do Except:
try
try
// Trechos de código
except
// Trechos de código
end;
finally
// Trechos de código
end;
TRY - EXCEPT
|
Variações do Except:
try
// Trechos de código
finally
try
// Trechos de código
except
// Trechos de código
end;
end;
TRY - EXCEPT
|
Variações do Except:
try
try
// Trechos
except
// Trechos
end;
finally
try
// Trechos
except
// Trechos
end;
end;
de código
de código
de código
de código
|
EXERCÍCIOS...
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
|
No caso do Except pode-se utilizar diferentes
ações para diferentes tipos de exceções, tais como
EInOutError;
|
Além disso, a cláusula else pode ser usada para
pegar todos os tipos de exceções inesperadas;
|
O tipo geral Exception é usado para pegar todos
os tipos de exceções;
|
Atribuindo um nome à exceção, o texto da
mensagem da exceção (Name.Message) pode ser
obtido para a exibição, ou então, para outras
finalidades;
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
try
// Trechos de código
except
on Nome: Tipo da Exceção do
// Trechos de código
else // opcional
// Trechos de código
end;
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
try
// Trechos de código
except
on Nome: Tipo da Exceção do
// Trechos de código
on E: Exception do
// Trechos de código
end;
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
try
// Trechos de código
except
on Nome: Tipo da Exceção do
// Trechos de código
on E: Exception do
showMessage(E.ClassName
+ 'erro gerado, com mensagem: '
+ E.Message');
end;
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
Classe
Descrição
Exception
Exceção genérica, usada apenas como ancestral de
todas as outras exceções
Eabort
Exceção silenciosa, pode ser gerada pelo
procedimento Abort e não mostra nenhuma
mensagem
EAccessViolation
Acesso inválido à memória, geralmente ocorre com
objetos não inicializados
EConvertError
Erro de conversão de tipos
EDivByZero
Divisão de inteiro por zero
EInOutError
Erro de Entrada ou Saída reportado pelo sistema
operacional
EIntOverFlow
Resultado de um cálculo inteiro excedeu o limite
EInvalidCast
TypeCast inválido com o operador as
TRY – EXCEPT COM DE TIPO DE EXCEÇÃO
Classe
Descrição
EInvalidOp
Operação inválida com número de ponto flutuante
EOutOfMemory
Memória insuficiente
Eoverflow
Resultado de um cálculo com número real excedeu o
limite
ERangeError
Valor excede o limite do tipo inteiro ao qual foi
atribuída
Eunderflow
Resultado de um cálculo com número real é menor
que a faixa válida
EVariantError
Erro em operação com variant
EZeroDivide
Divisão de real por zero
EDatabaseError
Erro genérico de banco de dados, geralmente não é
usado diretamente
EDBEngineError
Erro da BDE, descende de EDatabaseError e traz
dados que podem identificar o erro
CLASSE DE EXCEÇÃO
|
Criando a classe de exceção:
type
EUsuarioInvalido = class (Exception);
CLASSE DE EXCEÇÃO
|
Usando a classe de exceção:
procedure TForm1.btnClasseExcecaoClick(Sender: Tobject);
begin
raise EUsuarioInvalido.Create(‘Usuário Inválido’);
end;
EXCEÇÕES E O DEBBUGER
|
Quando você estiver usando o Delphi para testar sua
aplicação, antes das mensagens de tratamento de exceções
serem exibidas uma notificação de Exceção da IDE aparece
para você (passando a impressão de que o tratamento de
exceção não funcionou)
y
|
Mas às vezes isso fica sendo chato para testar uma
aplicação
y
|
Pressionando a tecla F9 é possível dar continuidade a aplicação;
Uma solução é testar fora do Delphi, rodando o executável;
Para testar a aplicação sem que apareça a notificação de
Exceção da IDE do Delphi faça o seguinte (Delphi 2006) :
y
y
Desmarque a opção “Notify on language exceptions ”, no menu
Tools | Options | Debugger Options | Borland Debuggers |
Language Exceptions;
Dessa forma as mensagens de exceção do depurador não serão
mostradas;
REFERÊNCIAS
|
BIBLIOGRÁFICAS
João Marcos Sakalauska
y
Tratamento de exceções - parte 1
http://www.planetadelphi.com.br/artigo/124/Tratamento%20d
e%20exce%E7%F5es%20-%20parte%201
y
Tratamento de exceções - parte 2
http://www.planetadelphi.com.br/artigo/125/tratamento-deexcecoes---parte-2
y
Tratamento de exceções - parte final
http://www.planetadelphi.com.br/artigo/129/tratamento-deexcecoes---parte-final
|
CANTÚ, M. Dominando o Delphi 2005: A
Bíblia. São Paulo: Pearson, 2006.