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