Delphi – LogEvents e Notificação de Erros ao Usuário em processos paralelos (TThread)

Share Button

Um boa dor de cabeça é resolver exceções em TThread, TTasks….

Base de Conhecimento
Como pré-requisito é preciso ter em mente (“recomenda-se”) não existir uma exceção não tratada dentro de uma TThread – então todos os processo deveriam tratar as suas exceções internamente com um Try/Exception.

   Try
      código com erro...
   Except
     on e:exception do
        fazer algo...
   end;

 

No framework parte do “post” LogEvents é possível prever o tratamento de exception acrescentando o método RUN…

procedure TLogListItems.Run(proc: TProc);
begin
  TThread.CreateAnonymousThread(
    procedure
    begin
      try
        proc;
      except
        on e: exception do
          LogEvents.DoErro(nil, 0, e.message);
      end;
    end).start;
end;

Com método RUN recebendo um ANONIMOUS Procedure – permite que a aplicação faça assim:

  // usado metodo ANONIMOUS para tratar exception internamente
  LogEvents.Run(
  procedure begin
        // código com potencial de exceção

       // força um exception
       raise Exception.Create('Error Message');
  end);

Como mostrar o erro ao usuário

O Framework “LogEvents” possui um método de inicialização “register” que o formulário irá se inscrever para receber mensagens… e outro para retirar a inscrição “unregister“.

LogEvents.register(self, DoErro, 0); // recebe os registro de ERROS

onde:

  • self é o formulário que irá recebe mensagens…
  • DoErro é o método do furmulario…
  • e o terceiro parâmetro é um identificador que qualifica o tipo de mensagem que irá receber

O mesmo formulário pode subscrever a receber mais de um tipo de mensagem;


    LogEvents.register(self, DoErro, 0); // recebe os registro de ERROS
    LogEvents.register(self, DoSucesso, 1); // registra para receber os sucessos

Para não receber mensagens – em geral quando o formulário fecha “close” usar: LogEvents.unregister(self);

Enviando mensagem para o formulário

O método genérico “Log” permite enviar uma mensagem para o identificador “0” (usado no register):

LogEvents.Log(‘Minha mensagem a ser mostrada’);

Para enviar uma mensagem com um identificador específico:

LogEvents.DoErro(nil, 1, ‘LOG…..’);  // register = 1

Código de Exemplo: LogEvents – Mostrando Erros ao usuário