Post: [Paralelismo no Delphi] Tratando exceções na Thread

Alessandro Medeiros

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


 

Faça sua busca

CATEGORIAS

POSTS RECENTES

E caso você tem interesse de conhecer mais sobre [Paralelismo no Delphi] Tratando exceções na Thread, acesse o nosso portal do CLUBE DE PROGRAMADORES EM DELPHI
Você não terá só conteúdos relacionados ao [Paralelismo no Delphi] Tratando exceções na Thread, 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.

Sobre
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 © 2022 – Todos os direitos reservados