Post: Centralizando as Exceptions do seu software

Alessandro Medeiros

Fala ai Radizeiros e Radizeiras, tudo bem com vocês?

Aqui no blog eu falei de como usar forms VCL e FMX no mesmo projeto, se você ainda não viu, clique aqui.

Nesse post, vou te passar mais uma dica, irei tratar um problema recorrente que muitos de nós programadores Delphi enfrentamos, que é o tratamento de exceções ou tratamentos de erros dentro do software.

Como você faz hoje o seu tratamento de erro?

Pode ser que você tenha um monte de métodos espalhados no seu software para gravar um log, em cada parte do seu software tem um try exception para gravar esses logs.

Estou aqui para lhe dizer que não tem necessidade nenhuma de fazer isso.

Para que possamos chegar a essa conclusão, precisamos remeter o que eu sempre prego na comunidade Delphi.

Vai Afundo entenda o que você faz dentro do código, não se limite a montagem de formulários, entenda o que está acontecendo, não se conforme, seja um eterno inconformado, essa dor da inconformidade é o que irá fazer você crescer.

Para chegarmos a solução para gravação de logs genéricas, você precisa saber o que está acontecendo, o que está acontecendo por trás das rotinas do Delphi, tudo como funciona, o que é um evento, o que é um ponteiro, etc…

Graças a tudo isso, nós conseguimos de forma única tratar todas as exceções dentro de uma única classe dentro do nosso projeto.

Primeiro, vamos criar um novo projeto VCL, eu irei deixa-lo salvo e disponível para que você possa baixar.

Com esse nosso novo projeto criado, iremos criar uma nova Unit e iremos salvá-la como Exception.

type
   TException = class
   private
   { private declarations }
   public
       constructor Create;
       procedure TrataException(Sender : TObject; E : Exception);
   end;

Ao observar o código você deve estar se perguntando, de onde você tirou isso dai e para que você quer isso?

Já já você irá entender melhor…rsrsr

O comando Application.OnException diz que quando acontecer alguma exceção na minha aplicação irá executar um evento.

Se você reparar na imagem logo abaixo, que a descrição de método é um evento dentro do Delphi, esse Exception está esperando receber uma procedure que tenha dois parâmetros, um TObject, e um Exception, para que ele possa iniciar uma referência para memória, assim todas as vezes que acontecer um Exception ele irá nesse endereço de memória e executará a procedure que está lá.

E é isso que vamos fazer, iremos criar uma procedure e vamos dizer para o Application.onException que toda vez que acontecer uma exceção, irá chamar o método que está aguardando tal requisição.

Iremos fazer alguma alterações na classe Exception que acabamos de criar.

type
    TException = class
    private
        FLogFile : String;
    public
    …
        procedure GravarLog(value : String);
    …
constructor TException.Create;
begin
    FLogFile := ChangeFileExt(ParamStr(0), '.log');
    Application.onException := TrataException;
end;

procedure TException.GravarLog(value: String);
var
    txtLog : TextFile;
begin
    AssignFile(txtLog, FLogFile);
    if FileExists(FLogFile) then
        Append(txtLog)
    else
        Rewrite(txtLog);
    Writeln(txtLog, FormatDateTime('dd/mm/YY hh:mm:ss - ', now) + value);
    CloseFile(txtLog);
end;

procedure TException.TrataException(Sender: TObject; E: Exception);
begin
    GravarLog('==================================');
    if TComponent(Sender) is TForm then
    begin
        GravarLog('Form: ' + TForm(Sender).Name);
        GravarLog('Caption: ' + TForm(Sender).Caption);
        GravarLog('Error: ' + E.ClassName);
        GravarLog('Error: ' + E.Message);
    end
    else
    begin
        GravarLog('Form: ' + TForm(TComponent(Sender).Owner).Name);
        GravarLog('Caption: ' + TForm(TComponent(Sender).Owner).Caption);
        GravarLog('Error: ' + E.ClassName);
        GravarLog('Error: ' + E.Message);
    end;
    GravarLog('===================================');
    Showmessage(E.Message);
end;

var
    MinhaException : TException;
    initialization;
    MinhaException := TException.Create;
finalization;
    MinhaException.Free;

Vamos analisar o código acima.

No Create eu passo o método ChangeFileExt para a variável FLogFile que adicionamos em nossa classe.

Esse método ChangeFileExt está recebendo dois parâmetros, o ParamStr(0), que sempre irá retornar o caminho completo da minha aplicação, e uma string ‘.log’, esse método ChangeFileExt só irá trocar a extensão do arquivo para o qual definimos no segundo parâmetro.

Desta forma eu tenho o meu arquivo de log com o mesmo nome do meu executável.

Na segunda linha do meu Create temos aquele comando que comentei no inicio do post, o Application.onException, que por sua vez recebe o meu método TrataException.

Logo no método TratarException, poderíamos criar diversas formas para o tratamento das exceções, como por exemplo, enviar por e-mail, gravar um arquivo, nós podemos especializar isso de diversas formas.

Mas para o post só criei uma rotina de criação de arquivo simples, onde criamos um método, o GravarLog, que irá receber um valor string e irá trabalhar a criação do arquivo texto. 

Dentro do nosso TratarException, simplesmente verifico se o objeto que chegou é um TForm eu pego e gravo os valores dentro do meu arquivo texto com as informações que preciso para tal situação.

E caso não seja um TForm fazemos um tratamento bem simples, onde estamos forçando para que ele pegue as propriedades do componente que deu o erro.

No final do método coloquei um Showmessage para que ao executarmos o nosso aplicativo possamos ver a mensagem de erro.

Vamos colocar um botão no formulário e iremos forçar um erro para que tenhamos nosso teste ok.

procedure TForm2.Button1Click(Sender: TObject);
var
   I : integer;
begin  
    i := strtoint('teste');
end;

Veja só após executarmos nosso projeto.

Viu a mensagem de erro que saltou na tela?

Essa mensagem tem que está em nosso arquivo de log, vamos verificar se ele foi criado e seu conteúdo.

O arquivo foi criado perfeitamente com o nome do nosso executável.

09/08/19 14:57:26 – ================================================
09/08/19 14:57:26 – Form: Form2
09/08/19 14:57:26 – Caption: Form2
09/08/19 14:57:26 – Error: EConvertError
09/08/19 14:57:26 – Error: ‘teste’ is not a valid integer value
09/08/19 14:57:26 – ================================================

As informações que colocamos para serem salvas no arquivo de log estão aí, e olha a mensagem de erro que apareceu na tela.

Todas as vezes que ocorrer algum erro em nosso sistema ele irá gravar nesse log agora.

Esse post faz parte do treinamento Técnicas avançadas de Delphi.

Nesse treinamento eu reuni as minhas melhores aulas dos meus mais diversos treinamento para entregar  para você um conteúdo que vai direto ao ponto, para que você não perca tempo e nem dinheiro na hora de aprender Delphi.

CLIQUE AQUI PARA SABER MAIS SOBRE O TREINAMENTO DE TÉCNICAS AVANÇADAS DE DELPHI.

 

Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre Centralizando as Exceptions do seu software, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao Centralizando as Exceptions do seu software, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
Gostou?
Compartilhe:

Embarque no foguete com milhares de devs para aprender desenvolvimento, evoluir de forma contínua e se manter relevante no mercado.

Dúvidas
Cadastre-se em nossa lista

Para ter acesso em primeira mão, a tudo que acontece na Academia do Código, basta se cadastrar em nossa lista

Grupo Thulio Bittencourt | Academia do Código

#FaçaPartedaHistória

Copyright © 2024 – Todos os direitos reservados