Atenção: por essa edição ser muito antiga não há arquivo PDF para download. Os artigos dessa edição estão disponíveis somente através do formato HTML.
Tratamento de Erros – II
A parte final do artigo que mostra como usar exceções para tratar erros em seus aplicativos Delphi.
Propriedades dos Objetos Exception
A classe Exception, de onde as demais classes que controlam exceções são derivadas, possui duas propriedades:
HelpContext: define o número da ajuda sensitiva associada à exceção.
Message: define a mensagem associada ao erro.
Enviando uma Mensagem para o Usuário
Para ler informações específicas sobre o erro ocorrido, você usa uma variação da estrutura on...do, que provê uma variável temporária que engloba a exceção. Nesse caso, você poderá criar seu próprio quadro de mensagem contendo a string da mensagem da exceção. Esta string utiliza a propriedade Message da classe Exception:
try
{comandos}
except
on E: {tipo da exceção} do
MessageDlg(‘...‘ + E.Message,
mtInformation, [mbOk], 0);
end;
Exemplo
Veja como ficaria o exemplo anterior, se oferecessemos ao usuário uma mensagem que o avisasse que um erro de conversão ocorreu:
procedure Form1. Button1Click(Sender:TObject);
var
a : Integer;
begin
try
a:=StrtoInt(Edit1.Text);
Edit2.Text:=IntToStr(a);
except on E:EConvertError
do
begin
MessageDlg(‘O seguinte
erro será tratado: ‘ +
E.Message,mtInformation,
[mbOk], 0);
Edit2.Text := ‘0’;
end;
end;
end;
Criando um Tratamento Padrão de erros:
Você pode prover um tratamento padrão de erro para tratar exceções que não tem tratamentos específicos. Para isto, adicione uma parte else na parte except do bloco:
try
{comandos}
except
on EPrimeiroTipo do
{código específico para o primeiro tipo de erro}
on ESegundoTipo do
{código específico para o segundo tipo de erro}
else
{código padrão de tratamento de erros}
end;
Tratando Erros com Exceções Genéricas
Além disso, você pode utilizar as exceções genéricas para tratar um erro, em vez de uma exceção específica. Por exemplo, se você quer tratar um erro relacionado a uma operação com inteiros, mas não sabe exatamente o erro, poderá utilizar a exceção EIntError, que é a exceção genérica da qual derivam outras exceções relacionadas a inteiros:
try
{comandos}
except
on EIntError do
{código de tratamento de
erros}
end;
Exceções da VCL
Os componentes do Delphi, dispostos na VCL (Visual Components Library) também geram exceções para indicar erros. Por exemplo, quando você tenta acessar um quinto item de um ListBox que só possui quatro elementos.
Exemplo
A aplicação abaixo tenta, ao clicar no botão Conectar, se conectar a um banco de dados não existente. O erro é tratado através da classe EDBEngineError:
procedure TForm1.Button1Click(Sender: TObject);
begin
try
Table1.DatabaseName:= ‘c:\livro\’;
Table1.TableName:= ‘Vendas.db’;
Table1.Active :=True;
except
on E:EDBEngine Error do begin
MessageDlg(‘O segui-te erro ocorreu: ‘ + E.Message, mtInformation,[mbOk],0);
end;
end;
end;
Exceções Silenciosas
Você pode definir exceções que não mostram um quadro de mensagem para o usuário quando aparecem. São chamadas exceções silenciosas. O caminho mais curto para criar esta exceção é através da procedure Abort. Esta procedure automaticamente gera uma exceção do tipo EAbort, que abortará a operação sem mostrar uma mensagem.
Exemplo
O exemplo abaixo aborta a operação de inclusão de itens em um ListBox, quando tentamos inserir o terceiro elemento:
begin
for i:= 1 to 10 do
begin
ListBox.Items.Add(IntToStr(i));
if i = 3 then Abort;
end;
end;
Definindo suas Próprias Exceções
Além das exceções geradas em tempo de execução e daquelas geradas pelo uso incorreto de componentes, você pode acrescentar a seu código tratamento para suas próprias exceções.
Para gerar uma exceção, chame a palavra reservada raise, seguinda por uma instância do objeto Exception:
raise Exception.Create(mensagem);
Exemplo
A aplicação abaixo contém uma caixa de edição e um botão. Se o usuário clicar no botão sem entrar com uma palavra na caixa de edição, um erro é gerado, através de uma exceção criada pelo programador:
procedure TForm1.Button1Click(Sender: TObject);
begin
if Edit1.Text = ‘’ then
raise exception.Create (‘Entre algum texto!’);
end;
Manipulando Exceções Globais
O Delphi oferece um evento chamado OnException, ligado à classe TApplication, que permite manipular qualquer exceção que ocorra em seu programa, mesmo que você não saiba em que parte do programa ela ocorreu.
Inicialmente, você deverá criar manualmente, como um método de TForm1, a chamada para o método que tratará os erros:
TForm1 = class(TForm)
...
procedure Nome_Método(Sender: TObject; E: Exception);
end;
Depois de declarar a procedure, você deve atribuí-la ao evento OnException de TApplication. A atribuição é feita no evento OnCreate do formulário principal:
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := Nome_Método;
end;
O novo método será agora chamado quando qualquer exceção ocorrer. Você pode determinar mensagens para erros específicos, ou mensagens gerais.
Exemplo
A aplicação abaixo cria um método chamado Trata_Erros, associado ao evento OnException da classe TApplication. Este método oferece algumas mensagens quando o erro é gerado:
TForm1 = class(TForm)
...
procedure Trata_Erros(Sender: TObject; E: Exception);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Application.OnException := Trata_Erros;
end;
procedure TForm1.Trata_Erros
(Sender: TObject; E:Exception);
begin
if E is EDatabaseError then
ShowMessage(‘Erro no banco de dados!’)
else
ShowMessage(‘Há erros no programa!’);
end;
Traduzindo mensagens de erro do Delphi
Se você possuir um manipulador de arquivos de recursos .RES (como o Resource Workshop), poderá alterar as mensagens de erro oferecidas pelo Delphi, traduzindo-as. Os arquivos de recursos do Delphi ficam no diretório \Arquivos de Programas\Borland\ DelphiX\Lib.