如何捕获后台线程中引发的未处理异常?

lok*_*oki 5 delphi firemonkey

我有习惯执行匿名线程,如:

TThread.CreateAnonymousThread(
   procedure
   begin
     .....
   end).start;
Run Code Online (Sandbox Code Playgroud)

但问题是如果在执行过程中会出现一些未处理的异常,那么我将不会被警告!对于我们的主线程Application.OnException.我们是否有类似的背景线程?

Rem*_*eau 10

TThread有一个公共FatalException财产:

如果该  Execute 方法引发了一个未在该方法中捕获和处理的异常,则该线程终止并设置  FatalException为该异常的异常对象.应用程序可以FatalExceptionOnTerminate事件处理程序进行检查,  以确定线程是否因异常而终止.

例如:

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)

  • @JerryDodge 我知道 OP 正在使用。[`CreateAnonymousThread()`](http://docwiki.embarcadero.com/Libraries/en/System.Classes.TThread.CreateAnonymousThread)。它返回一个挂起的 `TThread` 对象,你可以在调用 `Start()` 之前调整它的属性并为其分配事件处理程序 (2认同)

J..*_*... 5

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)