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.
[code]
Try
código com erro…
Except
on e:exception do
fazer algo…
end;
[/code]
No framework parte do “post” LogEvents é possível prever o tratamento de exception acrescentando o método RUN…
[code]
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;
[/code]
Com método RUN recebendo um ANONIMOUS Procedure – permite que a aplicação faça assim:
[code]
// 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);
[/code]
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;
[code]
LogEvents.register(self, DoErro, 0); // recebe os registro de ERROS
LogEvents.register(self, DoSucesso, 1); // registra para receber os sucessos
[/code]
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