请问Delphi里能不能象VB,Java一样能够从Exception里取出抛出异常的函数名称和行号? (100分)

  • 主题发起人 主题发起人 chenglh
  • 开始时间 开始时间
C

chenglh

Unregistered / Unconfirmed
GUEST, unregistred user!
经常要知道测试人员测试出的BUG是出现在哪个函数中。
我知道Java和VB有Exception.Trace / Exception.TraceInfo函数可以得到抛出异常的函数
和行号,不知道Delphi里面怎样才能实现这个功能?
--第二次提出[:D]
 
try
except on e:exception do
从e中取出信息
end;
 
用ExceptionErrorMessage吧
 
最好还是看看Help中的
Exception handling routines
 
用 EurekaLog4.04 就可比较方便显示出来,还有其它好几个 expert 也有类似功能!
 
如果是想在调试中显示行号,那么可以使用断言啊...就是..Assert()

语法:
procedure Assert(Test: Boolean);
procedure Assert(Test: Boolean; const Message: string);

使用Assert 过程来陈述和强调必须满足的假设,当测试条件为假时,就会产生一个异常,
在异常对话框中,就会显示是那个源文件,那一行产生的错误。。。

Assert 是从C中借鉴过来的,在C中没有异常处理操作,Assert 就成了程序员调试程序
的好帮手。
 
Assert抛出异常

procedure AssertErrorHandler(const Message, Filename: string; LineNumber: Integer; ErrorAddr: Pointer);
var
S: String;
begin
S := Format('%s (%s, line %d, address $%x)',
[Message, Filename, LineNumber, Pred(Integer(ErrorAddr))]);
OutputDebugString(PChar(S));
end;

initialization
AssertErrorProc := @AssertErrorHandler
 
  书接上一回:
  为了配合 Assert 的使用,Delphi还定义了一个过程指针:AssertErrorProc
当Assert断言失败时,就会调用 AssertErrorProc 指向的过程,同时将断言信息和行号等
传进这个过程。过程的原型是:
  procedure ErrorProc(const message, FileName: string; LineNumber: Integer;
Error Address: Pointer);
  过程赋值是: AssertErrorProc := @ErrorProc

  有了这个过程,你大可以将断言信息、文件名和行号保存到一个文件中,或 E_mail
给某某等,任你为所欲为。。。呵呵呵。
 
"来自:wr960204, 时间:2003-8-11 17:09:00, ID:2101057
编译完的程序是不可能的。因为Java是解释程序,所以可以确定行号。Delphi是真编译的,编译后的代码经过优化,不能在确定行号了
"
这是我上次提问得到的解答。当时觉得很有道理,后来想既然Debug模式下Assert可以显示行号,为什么不能在Debug模式下显示Exception的行号呢。

to Aiirii:
是不是有了EurekaLog4.04 ,编译出来的Exe就可以显示异常行号了?

To pihome,Linman:
因为写程序时可能不会考虑哪里的代码会出问题,所以不想使用断言以节省时间:),就想在运行时定位,方便找到测试人员测出来的异常问题出在哪里(测试人员都能看到提示:'**行抛出异常***',就象Assert一样的效果)。
测试员跑过来对你说:“老弟,我又捉住你程序中的一个大bug,你的untAbsNoBug单元的Perfect函数的第6行还是报错:access address *** denied ...”“怎么可能?我来看看..”

 
除了Assert没有其他方法了,这是经过编译器处理的,不是写几句程序就能做到的,如 wr960204 所说。。。
 
使用 Exception Magic 等控件,大量节省你的时间。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=621260
就不要麻烦flier大侠了,源码空间应该有下载。
记得把分给我[8D]
 
to chenglh:
  其实,Assert本身就是一个异常处理方法来的,完全可以用来处理那些条件异常。
对于那些产生异常后,使用 ShowMessage(errormessage)方式来显示异常信息的,可以
用 Assert(false)来代替。并且还有个好处,就是你可以在Assert所调用的异常过程中
做任何事情,例如收集异常进数据库,或E_mail到项目经理等等。。
 
Delphi也有不如VB的地方。
 
多谢iKing
寻找Exception Magic -中...DFW的源码空间在哪里(刚注册用户,不熟悉啊),是不是不能用了?

http://www.delphibbs.com/delphibbs/download.asp ->
"大富翁标记语言规范(DFWML)
大富翁论坛源程序 (最近改动很多,源程序暂停发布)
......
新概念离线阅读 - 通向大富翁之门"
 
to chenlh
1、源码空间 :www.playicq.com ,估计你没有下载权限
2、告诉我你的邮箱,我发给你,在delphi6下可用,安装使用看说明
3、参考 :http://www.delphibbs.com/keylife/iblog_show.asp?xid=197
 
公司邮箱:ProtectedNow@sitechasia.com,公司的Email服务器好象down掉了好几个小时了
不知道大不大,<2.5M可以发到:ConfidentialNow@sina.com
谢先

 
收到,多谢
再谢iKing和flier
先不结帖,给Exception Magic和类似控件做做广告,好东西不敢私藏...
 
多人接受答案了。
 
不错的帖子
 
后退
顶部