【发布时间】:2013-07-30 22:13:56
【问题描述】:
我写了一个TThread后代类,如果引发异常,将异常的Class和Message保存在两个私有字段中
private
//...
FExceptionClass: ExceptClass; // --> Class of Exception
FExceptionMessage: String;
//...
我以为我可以在OnTerminate事件中raise一个类似的异常,以便主线程可以处理它(这里是一个简化版本):
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;
我希望出现标准的异常处理机制(一个错误对话框),
但我得到的结果好坏参半:出现对话框,但随后出现系统错误,或者
或者(更有趣)出现对话框,但调用线程的函数继续运行,就好像从未引发异常一样。
我想问题出在调用堆栈上。
这是个坏主意吗?
是否有另一种方法可以将线程异常与主线程分离,但以标准方式重现它们?
谢谢
【问题讨论】:
-
根据我的实验,在
OnTerminate事件处理程序中引发异常会导致调用Halt。我认为您需要找到一种不同的方法来重新显示异常。 -
这里有一些有用的想法stackoverflow.com/questions/2923230/…
-
@大卫赫弗南:
Halt?我从来没有发现过这种情况。你能解释一下吗? -
不,我无法解释。但是我对您的场景的复制导致停止,然后进程终止。
-
哦,这很有趣。谢谢。