我写了一个TThread
后代类,如果引发异常,将异常的 Class 和 Message 保存在两个私有字段中
private
//...
FExceptionClass: ExceptClass; // --> Class of Exception
FExceptionMessage: String;
//...
我以为我可以raise
在事件中出现类似的异常OnTerminate
,以便主线程可以处理它(这是一个简化版本):
procedure TMyThread.Execute;
begin
try
DoSomething;
raise Exception.Create('Thread Exception!!');
except
on E:Exception do
begin
FExceptionClass := ExceptClass(E.ClassType);
FExceptionMessage := E.Message;
end;
end;
end;
procedure TMyThread.DoOnTerminate(Sender: TObject);
begin
if Assigned(FExceptionClass) then
raise FExceptionClass.Create(FExceptionMessage);
end;
我希望发生标准异常处理机制(一个错误对话框),但我得到的结果好坏参半:出现对话框但随后出现系统错误,或者(更有趣)出现对话框但调用线程的函数运行就好像从未引发异常一样。
我想问题出在调用堆栈上。
这是个坏主意吗?
是否有另一种方法可以将线程异常与主线程分离,但以标准方式重现它们?
谢谢