Fala ai Radizeiro e Radizeira, tudo bem com você?
Você tem acompanhado nossa série sobre paralelismos, e usado no seu dia a dia, pode ter se deparado com algumas exceções que eram preciso tratar nas Threads.
E você deve estar pensando de como tratar essas exceções nas threads.
Pensando nisso, no post de hoje irei mostrar para você como pode tratar essas exceções dentro das Threads.
Imagine o seguinte dentro do código abaixo à exceção.
procedure Tprocesso.Execute; var I : Integer; begin inherited; for I := 0 to 1000 do begin FAux := 'Valor = ' + I.ToString; Self.Queue(Self.Sincronizar); Self.Sleep(1); raise Exception.Create('Exception Gerada na Thread'); end; end;
Observe o que acontece ao executarmos essa Thread.
Observe que ele executa apenas uma vez, e não temos nenhuma mensagem de erro.
A Thread sofre uma exceção mas não tive como capturar essa exceção.
E é nesse momento que irei mostrar como capturar essas exceções dentro da Thread.
Primeira coisa que irei fazer, é criar um método.
procedure TForm1.Button1Click(Sender: TObject); var Processo : TProcesso; begin Processo := TProcesso.Create(Memo1); Processo.Onterminate := TrataThread; Processo.Start; end;
Observar na execução do botão, onde depois de criar a Thread, ele tem um método chamado OnTerminate, onde eu consigo interceptar essa exceção.
Esse método é um evento, e com ele consigo saber quando terminou essa thread e coletar algumas informações.
E observe que ao terminar eu passei um método que irá guardar essa ação.
Se observar na imagem abaixo o método Onterminate é um evento que aguarda uma procedure.
Vamos implementar agora nossa método de TratarThread.
private procedure TrataThread(Sender: TObject); ... procedure TrataThread(Sender: TObject); begin if Sender is TThread then begin if Assigned(TThread(Sender).FatalException) then Memo1.Lines.Add('A Thread Falhou: ’' + Exception(TThread(sender).FatalException).Message); end; end;
Ao terminar minha Thread, eu chamo esse método criado, onde dentro desse método eu trato o término dessa Thread, se a Thread foi interrompida por um access violation, ou por algum motivo, ela irá terminar, e quando ela terminar, irá iniciar esse método.
Observe que é capturado um método que existe dentro das Threads, que se chama Fatal Exception;
Dentro do botão eu crio uma Thread, e digo para ele que ao terminar eu chamo o meu método de exceção, e logo em seguida eu início a Thread.
procedure TForm1.Button1Click(Sender: TObject); var Processo : TProcesso; begin Processo := TProcesso.Create(Memo1); Processo.Onterminate := TrataThread; Processo.Start; end;
Dentro do método que acabamos de criar, ele verifica se o evento que está sendo chamado é de uma Thread realmente, se ele for, irá verificar se existe alguma exceção fatal, dizendo que ocorreu uma exceção dentro dessa Thread, se ocorreu eu pego o objeto da exceção, faço um casting na classe de exceção e captura a mensagem e adiciono dentro do Memo.
Viu que dessa forma conseguimos capturar as exceções dentro de nossas Threads.
Essa é a forma mais simples de capturar uma exceção dentro da Thread.
Agora você alem de trabalhar com as Threads, agora é possivel capturar erros dentro dela.
Conteúdos como esses você encontra dentro do CLUBE DOS PROGRAMADORES EM DELPHI.
E caso você tenha interesse de conhecer mais sobre PPL acessa o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI, onde você não só terá conteúdos relacionados aos generics, mas uma quantidade enorme de conteúdos que poderá lhe ajudar muito no seu dia a dia, é uma verdadeira NETFLIX para os programadores Delphi.
CLIQUE AQUI E SAIBA MAIS SOBRE O CLUBE DOS PROGRAMADORES DELPHI