大悟还俗

邮箱 key_ok@qq.com 我的收集 http://pan.baidu.com/share/home?uk=1177427271
posts - 236, comments - 8, trackbacks - 0, articles - 0
  新随笔  :: 联系 :: 订阅 订阅  :: 管理

捕获线程异常

Posted on 2013-10-09 12:06  大悟还俗  阅读(...)  评论(... 编辑 收藏

相关背景:

我们在做桌面级小程序时,一般的结构是:

  1. 设计业务对象
  2. 做工作线程
  3. 写界面

 

工作线程主要把业务对象给封装起来,处理时避免前台界面停止响应的情况。

但有时业务对象会有异常,需要反应到前台界面上,这时,我们需要捕获一下线程的异常

 

 

type
 
  TTrdExceptionDemo=class(TThread)
  private
    FException: Exception;
    procedure DoHandleException;
  protected
     procedure Execute; override;
     procedure HandleException; virtual;
  end;
implementation
procedure TTrdExceptionDemo.DoHandleException;
begin
    Application.ShowException(FException)
end;
procedure TTrdExceptionDemo.Execute;
begin
  FException := nil;
  try
    // raise an Exception
    raise Exception.Create('I raised an exception');
  except
    HandleException;
  end;
end;
procedure TTrdExceptionDemo.HandleException;
begin
  FException := Exception(ExceptObject);
  try
      Synchronize(DoHandleException);
  finally
      FException := nil;
  end;
end;
//测试
procedure TForm1.btn1Click(Sender: TObject);
begin
  with TTrdExceptionDemo.Create(True) do
  begin
    FreeOnTerminate := True;
    Resume;
  end;
end;
View Code