技巧:关于异常处理过程的一些知识(50分)

  • 主题发起人 主题发起人 shenloqi
  • 开始时间 开始时间
S

shenloqi

Unregistered / Unconfirmed
GUEST, unregistred user!
这里简略的介绍一些:
如果代码引发一个异常,它必须传递一个对象给raise语句。如果Delphi到了调用堆栈
的尾部而没有找到一个匹配的异常处理程序,它将调用ExceptProc。ExceptProc实际上是
一个指针变量,指向一个有两个参数(异常对象以及异常发生的地址)的过程。Delphi也
截获运行时错误(如堆栈溢出),并为每一个错误调用ErrorProc(类似ExceptProc)。
SysUtils单元为工作于异常和运行时错误提供额外的帮助。他定义了ErrorProc和
ExceptProc过程。SysUtils单元在他的初始化部分设置ErrorProc和ExceptProc例程。
如果应用程序在SysUtils单元被初始化之前引发了一个异常或者运行时错误,你将无法
使用它的例程和异常处理程序(这个异常处理程序将诸如堆栈溢出错误转为
EstackOverflow等)。因此,如果你的应用程序报告一个原始的运行时错误,而不是打
包成一个异常时,问题就可能存在于初始化或者结束化部分。

下面列出异常和错误相关的变量(存在于System单元):
AbstractErrorProc 抽象方法错误处理程序
AssertErrorProc 断言错误处理程序
ErrorAddr 运行时错误地址
ErrorProc 错误处理程序过程
ExceptClsProc 把一个Windows异常映射为一个Delphi类
ExceptionClass 异常基类
ExceptObjProc 把一个Windows异常映射为一个Delphi对象
ExceptProc 未处理的异常处理程序
SafeCallErrorProc 安全调用错误处理程序

这些东西可能并不需要被替换,但是了解他们总是有好处的:)
 
义务劳动?
 
學習,聚精會神關注。
 
小学生听课
 
delphi 把自己的异常转化为了 Win32的异常处理~
 
我也来这学习,谢谢!
 
翻译的不错
 
原文在《delphi技术手册》---delphi in a nutsbell中。中国电力出版社出版
 
to shenloqi:
请教一个异常的问题!
Delphi带的Demo:C:/Program Files/Borland/Delphi5/Demos/FastNet/Strm
新增一个Button:OnClick事件中只有一句代码:NMStrm1.Abort;
运行,传送一个比较大的文件,传送一半按中断(新增的Button),会报错,在Wind 2000下
将弹出一错误窗口:应用程序发生异常 未知的软件异常(0x0eedfade),位置0x77e67e08
在Wind9X下可能就是蓝屏了。
经跟踪到PSock.pas文件,里面有多条类似的引起异常的语句:
raise EAbortError.Create( sPSk_Cons_msg_send_a )

我试了,一执行到类似的语句就会出错,将这些语句都屏蔽掉后,可以运行下去,但是正
在传送的文件好象被锁死了,其它程序和自身程序无法再调用???
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
以上问题可能是FastNet控件包(我的FastNet升级过,带源码,升级包下载地址:
http://go8.163.com/windstorm2000/delphi.htm )中的NMStrm、NMStrmServ控件
的一个BUG,如能解决不胜感激,定给200分酬谢!!!

另:请不要说不用FastNet控件,用其它控件之类的,因为程序已经用了FastNet控件,如再
改成其它控件工程量太大(我也知道FastNet控件包有很多BUG)
 
这个不是bug,文件传送到一半时如果中断,端口抛出一个异常,就是要让你在你的程序中
截获这些异常并做一些处理,比如设置文件的某个标志使其不再处在被调用状态(或许:),
不要问我要处理什么,我没有处理过文件,不知道具体要作什么处理。你查看控件代码中
传送前的代码应该可以找到代码对文件做了什么锁定标志,把它解除)。

你把触发异常的代码注释掉了当然就不会出错了,但是你本来应该要做的事情就没机会做了。
所以你的文件不能用了:)记住:不是所有的异常都是错误,但如果异常不处理,就会成为
错误:)对程序员来说,异常只是告诉你发生了某件不正常的事,提醒你要处理它。点到为
止,自己琢磨:)
 
to 京工之鸟:
我要是琢磨的出来还来这里提问干嘛啊?我前几天开了个贴子,放了差不多一星期,几乎没人
从正面回答(总共回复的也才两个,阅读的倒不少),不是叫我用别的控件,就是说高手从不用
FastNet这种垃圾控件,唉...
=====================================================
看来你是没去看那个Demo了!这是个最简单的文件传送Demo,部分代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
MyFStream: TFileStream;
begin
//原码是打开图片文件对话框,我改成打开普通文件对话框
// If OpenPictureDialog1.Execute then
If OpenDialog.Execute then
Begin
NMStrm1.Host := Edit2.Text;
NMStrm1.FromName := Edit1.Text;
// MyFStream := TFileStream.Create(OpenPictureDialog1.FileName, fmOpenRead);
MyFStream := TFileStream.Create(OpenDialog.FileName, fmOpenRead);
try
NMStrm1.PostIt(MyFStream);
finally
MyFStream.Free;
end;
end;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
//我想不通的是为什么简单的中断也会触发异常,而且这异常不知如何捕捉?
NMStrm1.Abort;
{//用Try..Except..无法捕捉到异常错误信息
try
NMStrm1.Abort;
except
showmessage('错误');
end;
}
end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
Application.OnException := AppException
//设置错误陷阱
end;

procedure TForm1.AppException(Sender: TObject
E: Exception);
{错误陷阱}
var
sMsg : string;
begin
//虽可以捕捉到上面所提到的异常错误?但是显示错误信息之前也先弹出弹出一
//错误窗口:应用程序发生异常 未知的软件异常(0x0eedfade),位置0x77e67e08
//现在问题是如何做到不弹出此错误窗口?
sMsg := E.Message;
Showmesage(sMsg);
end;
 
To:京工之鸟
对呀,这就是我看那本技术手册后觉得有用的东西,于是就贴了上来,觉得对于一些不曾
怎么了解Delphi的人可能有一些好处,我另外也贴了几个帖子,大部分也是我看这本书之后
写的,我觉得除了未来化以及语法等这本书的好一些的东西就是我贴出来的帖子了,关于
Delphi对象模型,我看了2.7版本的Hubdog大虾的葵花宝典里面已经有了,所以就没有多事
(在新增加的OOP部分)。
我之所以不向大家推荐这本书,是因为我觉得他好像作为一个技术手册来说还是内容少了
一些,因为它主要就是讲述的Delphi Object Pascal的内容,以及讲述了SysUtils.pas,
System.pas,RTTI,多线程编程(未来化)这几个方面,不过我觉得有了一定的C++基础看
这本书可能得益要比直接学Delphi的收益大一些。
 
To Wind2000:
这段时间没有上网,所以很慢才看到你的跟贴(因为我现在处于老合同期满,准备到新
的公司上班的情形)。
因为我刚刚使用Delphi的时候就听大家说FastNet的种种不好,所以就没有准备使用它,
也就没有好好的研究它,真的很惭愧,暂时因为上面说的原因,我也不能好好的研究您说
的问题,我想等我新工作稳定了我才有时间来研究它,所以抱歉了先,不过如果您知道了
解决方案不妨告诉我:)
 
多人接受答案了。
 
后退
顶部