Exception 如何捕获线程中生成的异常以便能够对其进行操作

Exception 如何捕获线程中生成的异常以便能够对其进行操作,exception,delphi-7,Exception,Delphi 7,我的应用程序中有一个处理生成异常的过程。事实证明,如果异常是在unthreaddsr中生成的,则异常不会被该过程捕获,而该过程也应该对其进行操作。如果异常是从任何其他表单生成的,则过程将正确捕获它 该过程位于主数据模块中: ... private { Private declarations } procedure HandleExceptions(Sender: TObject; E: Exception); ... procedure DM.HandleExceptions(Sen

我的应用程序中有一个处理生成异常的过程。事实证明,如果异常是在unthreaddsr中生成的,则异常不会被该过程捕获,而该过程也应该对其进行操作。如果异常是从任何其他表单生成的,则过程将正确捕获它

该过程位于主数据模块中:

...
private
  { Private declarations }
  procedure HandleExceptions(Sender: TObject; E: Exception);
...

procedure DM.HandleExceptions(Sender: TObject; E: Exception);
begin
  if pos('UNIQUE KEY',E.Message) <> 0 then
  begin
    if pos('UNQ_CUSTOMER_NAME',E.Message) <> 0 then
      MsgMsg('Customer already registered.',2)
    else if pos('UNQ_USERS_LOGIN',E.Message) <> 0 then
      MsgMsg('User already registered.',2);
  end else
  if pos('ERROR_DATASYS',E.Message) <> 0 then
    MsgMsg('The Server Date is incorrect. Please contact your network administrator!',2)
  else //Other messages will be sent to Support
    SendReport(E.Message, V_COMPANY, V_LOGIN, V_APP_VERSION, Sender);
end;
TThreadDSR的调用方式如下:

procedure TFrmDSR.btnExecuteClick(Sender: TObject);
var
  Thread: TThreadDSR;
begin
  Thread := TThreadDSR.Create(true);
  Thread.FreeOnTerminate := true;
  Thread.Resume;
end;

异常不会跨越线程边界。如果未捕获的异常从
TThread.Synchronize()
调用的过程中逃逸,
Synchronize()
捕获异常并在工作线程的上下文中重新引发它。如果
Execute()
随后没有捕获异常,线程将终止并将异常分配给
TThread.FatalException
属性


您可以使用
TThread.OnTerminate
事件(在主线程的上下文中调用)将
FatalException
传递给
HandleExceptions()
过程。

异常不会跨越线程边界。如果未捕获的异常从
TThread.Synchronize()
调用的过程中逃逸,
Synchronize()
捕获异常并在工作线程的上下文中重新引发它。如果
Execute()
随后没有捕获异常,线程将终止并将异常分配给
TThread.FatalException
属性


您可以使用
TThread.OnTerminate
事件(在主线程的上下文中调用)将
FatalException
传递给
HandleExceptions()
过程。

在主线程中引发异常。这就是您想要的吗?我希望所有从“TThreadDSR”生成的异常都能被“DM.HandleExceptions”捕获,这样我就可以处理错误消息。异常在主线程中引发。这就是您想要的吗?我希望所有从“TThreadDSR”生成的异常都能被“DM.HandleExceptions”捕获,这样我就可以处理错误消息了。
procedure TFrmDSR.btnExecuteClick(Sender: TObject);
var
  Thread: TThreadDSR;
begin
  Thread := TThreadDSR.Create(true);
  Thread.FreeOnTerminate := true;
  Thread.Resume;
end;