Ferramentas Pessoais
Você está aqui: Página Inicial Programação ObjectPascal Tratamento de erros

Tratamento de erros

por Alan Candido última modificação 18/03/2010 02:52

As mensagens de erro emitidas pelo ObjectPascal, na maioria das vezes são em inglês. O que para os programadores e usuários mais exigentes, não pode passar assim e além do que, sempre tem aquele usuário que acha que "apagar o root(rut)", é matar a mulher do chefe [:>}. Para esses programadores e usuários, aí vai uma solução.

A ideía

 Existe uma série de propriedades e métodos, muitos dos quais não explorados pelos programadores, da classe TApplication, que pode ser acessada através da variável global Application. E um desses métodos, permite a manipulação de mensagens de erro, portando associaremos um procedimento de apresentação de mensagens a este evento, que é OnException.

Esta associação, ou qualquer outra, para configurar ou mudar o comportamento do TApplication, deve ser feita, preferencialmente, no evento OnCreate do formulário principal.

A implementação

 Selecione o formulário principal e no Object Inspector, na aba Events, selecione OnCreate e efetuando um duplo-click, algo semelhante ao código abaixo aparecerá.

procedure TForm1.Form1Create(Sender: TObject);
begin
end;

Insira, entre os comandos Begin..End, o código para associação do evento.

// Utilize o OnCreate do form principal para configurar Application.
// ** Designar a procedure de tratamento de erros
  Application.OnException := ShowException;

 O evento OnException da Application esta sendo associado ao método ShowException. Este método por ter qualquer nome, deste que os parâmetros sejam como abaixo. Para uma perfeita compilação, deve-se declarar este procedimento (em negrito) na classe de definição do formulário principal.

    TForm1 = class(TForm)
       // definições do form feitos em tempo de design
       private
       // definições privativas do form
       // Eu costumo colocar as definições para TApplication aqui,
       // mas pode ser colocada em qq outra seções da definição
       // da classe
       procedure ShowException(Sender: TObject; E: Exception);
       protected
       // definições protegidas do form
       public
       // definições publicas do form
    end;

Uma vez declarado o procedimento, vamos a implementação. Em qualquer lugar da implemention, insira o código abaixo.

procedure TForm1.ShowException(Sender: TObject; E: Exception);
var cValue: string;
begin
     // Todo e qq erro que ocorrer no aplicativo, passará por aqui
       if E is EConvertError then // Erros de conversão
       begin
          // O truque é testar trechos fixos das mensagems
          if pos('not a valid date', EConvertError(E).Message) <> 0 then
          begin
             // Aqui eu verifiquei que da 1a. posição até o primeiro espaço, esta o dado digitado.
             // Isto muda de msg para msg
             cValue := copy(EConvertError(E).Message, 1, pos(#32, EConvertError(E).Message));
             ShowMessage('A data '+ cValue +' que foi informada, não é válida. Favor informa-la novamente');
            // Devolve o foco para a entrada que esta com erro
             TWinControl(Sender).SetFocus;
          end else
            // Tratamento padrão
            Application.ShowException(E);
       end else if E is EDatabaseError then // Erros de DB
       begin
          if pos('name missing', EDatabaseError(E).Message) <> 0 then
          begin
             // Aqui eu verifiquei que da 1a. posição até os dois pontos (:), esta o nome do componente.
             // Isto muda de msg para msg
             cValue := copy(EDatabaseError(E).Message, 1, pos(':', EDatabaseError(E).Message)-1);
             ShowMessage('O componente '+ cValue + ', esta com o nomede banco de dados errado.'+#13+
                  'O sistema será encerrado ao acionar o botão OK');
             Application.Terminate; // Terminou porque o erro é grave
          end else
             // Tratamento padrão
             Application.ShowException(E);
       end else
          // Tratamento padrão
          Application.ShowException(E);
    end;

Monte os blocos IF E is ... End para cada tipo de mensagem a ser processada e dentro de cada bloco, teste trechos da mensagem original e se for o caso apresente a nova mensagem usando ShowMessage ou outro que lhe for mais apropriado. Não esqueça de chamar a rotina padrão de tratamento de mensagens do ObjectPascal, para aquelas que você não tratou, senão o erro será "engolido" pelo sistema.

Conteúdo relacionado
Ações do documento
Acessar


Esqueceu sua senha?