说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

捕捉来自 Thread 的异常-Delphi资料

HTML文档下载 WORD文档下载 PDF文档下载
捕捉来自 Thread 的异常-Delphi资料

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 Execute; override;

procedure HandleException; override;

...

public

...

end;

var

Form1: TForm1;

implementation

{$R *.DFM}

procedure TBaseThread.DoHandleException;

begin

// 关闭当前主窗体对鼠标的响应

if GetCapture <> 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;

...

支付宝风控系统对外输出 联合机构建支付安全生态圈 不同设备不同界面:Windows 9正在逼近! 福特联手英特尔 为汽车打造智慧感应系统 《近匠》环信:标准化即时通讯与未来社交构想 支持Swift!全新“四步测”BDD框架Quick诞生 中国式移动办公 纷享销客完成B轮融资千万美元 打造完美用户体验:“天翼平台开放日”沙龙纪实 我的编程认知:多思考、多编码、多测试 聚焦应用开发 2014年微信开发者大会即将召开 继续补Bug,jQuery Mobile发布1.4.3版本 手游SDK服务商棱镜公司获A轮投资 东方弘道领投 广而告之:Databricks终止Shark项目,转至Spark SQL DeNA China副总裁黄雪斌:IP战国时代的生存法则 巴别时代首席执行官赵暕:从页游到手游的完美转身 Oracle借助RESTFUL API扩展移动端版图 优秀求职者应主动问的5个问题 高德LBS智能硬件编程马拉松:硬件复兴,等你挑战! 首届bong线上黑客马拉松:运动数据分析应用bong+获大奖 英特尔推出基于WebRTC的协同通讯方案 凸显本土创新“软”实力 一周消息树:不同设备不同界面的Windows 9正在逼近! 乐卓网络CEO李澄澄:移动游戏IP是把双刃剑 高性能动画!HTML5 Canvas JavaScript框架KineticJS Swift最酷炫的七大功能 微信开发者大会讲师介绍:柳峰与你一起玩转公众平台应用开发 TIOBE 2014年7月编程语言排行榜:仅发布1月,Swift进Top 20! 艾格拉斯CEO王双义:手游自研引擎的荣耀之路 以招行为例,深圳云软黄榕振谈微信公众帐号企业应用高级开发 来自前苹果高管Heidi Roizen的经验之谈 【短讯】Dropbox、微软OneDrive打不开,国内用户该如何应对? 5分钟弄懂Docker! RakNet:被OculusVR收购的跨平台游戏网络引擎 asp.net 怎样学习 请问我的要存放含有‘年月日时分秒毫秒微秒’的数据能否用date类型存储? 谁来帮我解决一下问题——解决者另外加分100 问:sys/wait.h 是unix下的一个宏吗? 救命! 请问高手 网页问题 再次跪求教物资进库表和物资库存表的问题! 请问高手,如何在asp中调用,在线等候… 关于局域网的一个问题 一个表的记录写到另一个表中的问题??UP有分 蔡鸟求助:如何用vc++把一个文件(比如图纸)存到局域网中别的机器上 我有IIS的服务器的网站,我用什么软件能知道有谁正在下载什么文件?? 求MICROSOFT VISUAL STUDIO.NET 2002 中文企业版,2003不要,谢谢~ MySQL JDBC 驱动程序在哪里下载? 请教八数码难题的解法! 有在ASP 下 用过regexp类的吗?? 急救!关于ON_WM_ACTIVEAPP的问题 MySQL JDBC 驱动程序在哪里下载? mysql for linux 启动问题? 51job的动态简历预览功能暴快,有谁知道采用了什么样的技术? 请教为什么KeyUp事件不响应? 程序有两个线程时,如果子线程是个死循环,永远不停(如监听一个Socket),那当我的主线程return了后,程序会不会退出呢? 我重载了WM_NCPAINT来画窗体边框和标题栏,可是菜单就不见了,如何给画出来? 如何将INTERBASE中的数据导出到EXCEL文件中?! 关于C# 需要server2003企业中文版(激活的)地址! sql查询问题 update 的问题 急!IIS连接不上 装上JDataConnection Server之后,在数据源ODBC中的驱动程序列表中没有JDBC驱动算不算问题,高分求解! 短消息服务提供商(SP)程序问题 activeX控件问题,急盼高手帮助! 请教八数码难题的解法! 如果一个dll,在它里面有一个窗口,而有一个函数是这个窗体类的一个函数,那么如果在使用这个dll文件中的这个函数。 谁能给一个测试是否是EMAIL的函数?急! 如何实现关键字查询? 只能让家里的电视出现更多的台,比如解码器什么的! 急问:那位了解 sys/wait.h ,它的功能是什么? 求MICROSOFT VISUAL STUDIO.NET 2002 中文企业版,2003不要,谢谢~ saucer(思归)在吗?有问题请教! 哪里有C++ Builder 下载的。 TTrayIcon中的图标颜色只能显示16色的吗? HELP!!!XML怎么写成物理文件到本地? 这是为什么呀?电脑高手请进。。。 也说技术人员创业 高分:虚拟主机问题 快被OVERLAY搞死了,急救 中了“盗贼”木马,如何删除? 请网络高手来看看这个问题,给我点提示和建议?急急急 汉字在exe 文件的十六进制 能否 转换得来? observe和recognise用法区别 雕像怎么写 为郑和的塑像写一段介绍练习册上的题目 为郑和的塑像前写一段介绍读完这段话,你一定非常敬佩郑和这位历史人物.如果有机会为他的塑像写一段介绍,你会有怎样的评价呢?请结合课文内容给郑和写个简单的评语.(注:只需要一段 沙漠灰潜伏家 怎么上房,我卡进去了怎么飞墙?按什么键啊?CF的教教我 画眉鸟飞进家好不好今天晚上一只画眉鸟飞进家二楼大厅里,有什么兆头? 为郑和的塑像写一段话请结合课文内容给郑和写一个简单的评语. 读了《大作家的小老师》这篇文章,使我深受感触.有什么语句毛病 我怀着激动的心情来发表问题,看看有木有效果 论组词有哪些 把抛物线y等于-2分之一x的平方平移得到抛物线m抛物线m经过a(-6,0)和原点o(0.0)求抛物线m的解析试 法国征收75%富人税致LV老板移民 日议员提议给安倍出席国会次数设上限美媒:美情报机构曾针对俄中进行情报收报告称加拿大恐无法完成2020年减碳日本欲以“和食”申遗为契机吸引更多外瑞金创建“共和国摇篮”5A级景区 投马英九:过去5年实践九二共识内涵 未镇党委书记就拖欠猪蹄店70万致歉 称日民主党深刻反省野田内阁未根本解决福东京股市日经股指大跌2.75%中欧为推进经贸关系谋共识沪指暴跌321.45点 乌鲁木齐市股新疆且末县发现汉唐时期水利灌溉体系新疆交通要道、旅游景区餐饮服务食品安杨德志:争取把新疆村村户户的土地都“来晨报花季夏令营当“百变天使”中国银行新疆分行扬子江路中心支行: 国网乌鲁木齐供电公司带电消缺提高供电疆企特色路:永利商贸抢占中亚果蔬市场去年新疆航班量增速全国最快新疆建筑隔声性能实验室成立新疆阿勒泰供电公司开展“六一”国际儿绝对权力无限演绎神机仙道超级因果抽奖仪极限速病毒的誓言大秦血魂辰主披荆十洲风云志飞升系统北部湾广场旅游西樵黄大仙祠旅游大青沟旅游珠日河草原旅游振风塔旅游徽园旅游徽文化民俗博物馆旅游龙王塘樱花园旅游天津热带植物观光园旅游九寨沟喜来登国际大剧院旅游关闸旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘