Я хочу поймать исключение, поднятое в TTask из основной формы / основного потока
var
aTasks: array of ITask;
begin
Setlength(aTasks, 2);
aTasks[0] := TTask.Create(procedure begin
raise Exception.Create('Error1');
end);
aTasks[0].Start;
aTasks[1] := TTask.Create(procedure begin
raise Exception.Create('Error2');
end);
aTasks[1].Start;
TTask.WaitForAll(aTasks);
end;
В основную форму (основной поток) я вижу это:
Я попытался перехватить исключение и повторно поднять его в основной поток
var
aTasks: array of ITask;
begin
Setlength(aTasks, 2);
aTasks[0] := TTask.Create(procedure begin
try
raise Exception.Create('Error1');
except on E : Exception do
begin
TThread.Queue(TThread.CurrentThread, procedure
begin
raise E;
end);
end;
end;
end);
aTasks[0].Start;
aTasks[1] := TTask.Create(procedure begin
try
raise Exception.Create('Error2');
except on E : Exception do
begin
TThread.Queue(TThread.CurrentThread, procedure
begin
raise E;
end);
end;
end;
end);
aTasks[1].Start;
TTask.WaitForAll(aTasks);
end;
но в основной форме я вижу это:
Как перехватить и повторно вызвать исключение потока для основного потока?
UPDATE
возможно я нашел правильный путь, используя AcquireExceptionObject
:
var
aTasks: array of ITask;
begin
Setlength(aTasks, 2);
aTasks[0] := TTask.Create(procedure
var
CapturedException : Exception;
begin
try
raise Exception.Create('Error1');
except
CapturedException := AcquireExceptionObject;
TThread.Queue(TThread.CurrentThread, procedure begin
raise CapturedException;
end);
end;
end);
aTasks[0].Start;
aTasks[1] := TTask.Create(procedure
var
CapturedException : Exception;
begin
try
raise Exception.Create('Error2');
except
CapturedException := AcquireExceptionObject;
TThread.Queue(TThread.CurrentThread, procedure begin
raise CapturedException;
end);
end;
end);
aTasks[1].Start;
TTask.WaitForAll(aTasks);
end;
теперь я вижу правильную ошибку:
это стандартный способ распространения ошибки в основной поток?