摘要载入中…    请稍等…












内容载入中…    请稍等…

如长时间看不到内容,请关闭浏览器,重新打开此页!

芯友首页 应用软件 编程开发 网络硬件 资源下载 动漫音乐 精美图库 芯友论坛 视频教程 电脑技术QQ群:65314343
 ★★photoshop学友-10万图书免费看★★
 位置:编程开发>Deiphi>Deiphi程序调试
◎→ 本类最新
异常死亡进程的自动复活
自定义错误捕捉信息
delphi 7.0生成的AgentObjects_T
DELPHI编译错误中文说明
delphi编译错误信息
delphi运行错误信息
捕捉来自Thread的异常
◎→ 相关资源
VB窗体文章
HTML入门教程
JavaScript入门教程
VbScript入门教程
ASP.net入门教程
C语言入门教程
Deiphi实例教程
Deiphi窗体文章
Deiphi数据库编程
Deiphi网络编程
◎→ 热门资源
得到已安装的应用程序列表
定制系统菜单
SEO实践增加外链方法
程序调用控制面板设置
常用文件目录操作
采用多线程技术来关闭applicatio
不用注册新部件就能增加新的方法
不用MediaPlayer播放Midi
从实作标题栏按钮开始浅谈组件的
从实作标题栏按钮开始浅谈组件的

捕捉来自Thread的异常


日期:2008-5-31 18:27:58    来源:
   
 -->捕捉 MouseExit 事件
 -->百度今天有点异常

捕捉来自Thread的异常


Thread我们进行应用和设计时不可缺少的利器,然而它却不是轻易就可以掌握的。作为一个不可视系统组件,它封装在TThread类中,由于一个子线程可以与主线程同时运行,因此,来自子Thread的异常在主程序里未必能捕捉到,这样,来自子线程的异常就会导致Application的错误甚至是崩溃,也可能造成主程序都结束了,某个Thread还因等待同步对象的信号还在那儿自己运行着。所以,对于有必要进行异常控制的Thread就必须进行异常处理,这个异常处理块最好独立于主程序的异常处理模块。我们都知晓对通常异常的捕获都用一个try..finally块来处理,而对来Thread 的异常也不例外:

procedure TMyThread.Execute;
begin
try
// 在安全区应该做的工作
except  
// 处理所有的异常
end;
end;

  通常,这样的处理可以正常的工作,但却不是恰当的解决方法。我们希望不仅把异常信息传递给用户,而且要求在不影响Thread继续工作的前提下,由Application或系统单元(致命异常)来进一步处理异常。要做这样处理,首先,我们在自己的 Thread 类里定义一个异常对象,由这个对象承载各种要处理的异常类实例。其次,建立响应异常的同步事件。对EAbort消息加以抑制,对来自程序本身的异常由Application处理,对系统级异常,一般交与操作系统来完成。以下是一个简单的异常捕捉应用框架。

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,  
Graphics, Controls, Forms, Dialogs, StdCtrls;
type
  TForm1 = class(TForm)
  Button1: TButton;
  procedure Button1Click(Sender: TObject);
private
  { Private declarations }
  Procedure RunThread;  
public
  { Public declarations }
end;

TBaseThread = class(TThread)
private
  FException: Exception;
  procedure DoHandleException;
  protected
  procedure Execute; override;
  //父类函数为虚,在子类再重载其而处理具体事宜
  procedure HandleException; virtual;
public
end;

TMyThread = class(TBaseThread)
private
  ...  
  protected
  procedure Exec ; override;
  procedure HandleException; override;
  ...  
public
  ...
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TBaseThread.DoHandleException;
begin
// 关闭当前主窗体对鼠标的响应
if GetCapture $#@60;$#@62; 0 then SendMessage(GetCapture, WM_CANCELMODE, 0, 0);
// 判断异常的范围并做相应处理
if FException is Exception then
  Application.ShowException(FException)
else
  SysUtils.ShowException(FException, nil);
  ...
end;

procedure TBaseThread.Execute;
begin
  FException := nil;
try
...
//处理一些事情
except
//如果发生了异常
  HandleException;
end;
end;

procedure TBaseThread.HandleException;
begin
//得到当前异常对象
  FException := Exception(ExceptObject);
try
//避免因 EAbort 消息使程序推出
  if not (FException is EAbort) then
    Synchronize(DoHandleException);
finally
  FException := nil;
end;
end;

procedure TMyThread.Execute;
begin
...
end;  

procedure TMyThread.HandleException;
begin
...
end;

procedure TForm1.RunThread;
begin
//为 TMyThread 类创建实例
with TMyThread.Create(True) do
begin
FreeOnTerminate := True;
Resume;  
end;
end;
... 

 [1]

怎样捕捉窗体的鼠标?

Windows XP操作系统常见的异常故障解决方法

Tags:  捕捉 Thread 异常
{$enumber$}


芯友网版权所有 1999-2006 | 著作权与商标声明 | 法律声明 | 服务条款 | 隐私声明 | 联系我们