我有习惯执行匿名线程,如:
TThread.CreateAnonymousThread(
procedure
begin
.....
end).start;
Run Code Online (Sandbox Code Playgroud)
但问题是如果在执行过程中会出现一些未处理的异常,那么我将不会被警告!对于我们的主线程Application.OnException.我们是否有类似的背景线程?
Rem*_*eau 10
TThread有一个公共FatalException财产:
如果该
Execute方法引发了一个未在该方法中捕获和处理的异常,则该线程终止并设置FatalException为该异常的异常对象.应用程序可以FatalException从OnTerminate事件处理程序进行检查, 以确定线程是否因异常而终止.
例如:
procedure TMyForm.DoSomething;
begin
...
thread := TThread.CreateAnonymousThread(...);
thread.OnTerminate := ThreadTerminated;
thread.Start;
...
end;
procedure TMyForm.ThreadTerminated(Sender: TObject);
begin
if TThread(Sender).FatalException <> nil then
begin
...
end;
end;
Run Code Online (Sandbox Code Playgroud)
N̶o̶,̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks Thanks ThanksThanks̶̶̶̶̶̶̶̶̶̶̶̶̶̶̶
最好的解决方案是始终绝对肯定永远不要让异常从线程中逃脱.理想情况下,您的线程过程应如下所示:
TThread.CreateAnonymousThread(
procedure
begin
try
{ your code}
except
{on E : Exception do}
{... handle it!}
end;
end).start;
Run Code Online (Sandbox Code Playgroud)