Esse artigo faz parte da revista Clube Delphi edição 9. Clique aqui para ler todos os artigos desta edição



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.