大讨论!给我一个用try finally的理由,先! (200分)

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

com

Unregistered / Unconfirmed
GUEST, unregistred user!
做个测试先[8D]
如下程序只是为了说明try except end 会给程序增加多大开销,
你别吹毛求疵说: 我考这也用try except.
我对一些人的灌水本事真是怕了,所以不得不先声明一下.[:(!]

procedure TForm1.Button1Click(Sender: TObject);
var
i : Integer;
tick : Cardinal;
begin
tick := GetTickCount;
for i := 0 to 99999999 do
try
if 'asdfkl;jaskl;dfjaskl;dfjl;' = 'asdfklasjfsh' then
ShowMessage('adf');
finally
end;
Label1.Caption := IntToStr(GetTickCount - Tick);
end;

try finally 耗时 1900 毫秒
try except 耗时 570 毫秒
没有try 耗时 130 毫秒

try finally 的开销居然要比except 大近3倍 还不能保证程序不崩溃,
而try excetp 可以达到 finally 的一样效果(就是保证资源释放,因为
即使出现异常程序仍然可以继续执行,所以能保证资源的释放),又可以防
止程序崩溃,那我们凭什么还要用try finally呢?VCL的源码里也都是.
咋就没见过谁这么写程序:

xx := Txx.Create
try
//Do something
excetp
end;
xx.Free;
 
不知那是谁写的程序,好像竟然是在追求程序的行数,呵呵~~~
我的原则:能省就省,免得节外生枝~~~
 
try finally 和try except 的功能真是一样?用途不一样嘛,还搞什么评比,聊无,
我得好好去查查,呵呵。免得某些人又说“我对一些人的灌水本事真是怕了”
 
liangdewei
你不懂编程就不要乱说话![:(!]
 
我的意见是:
因为Finally,所以,它得等所有的动作都玩完了后才释放结束,所以要等得久一些.
而Except是只有出错就释放,它不必等到最后.
不用try,而时间少许多,我想就不用解释了吧?
你将出错指到最后一个循环看看时间会差多少?
我只是随口说说,我也没有测试.想听听高手的精确解释和原因.
 
>>try excetp 可以达到 finally 的一样效果(就是保证资源释放,因为
>>即使出现异常程序仍然可以继续执行,所以能保证资源的释放),又可以防
>>止程序崩溃
不是吧?我觉得excetp出现异常程序可继续运行,并不意味着资源肯定已释放。
 
变态,你用下面的代码测试一下看看?
try
...
if 条件 then exit;
....
finally
...
end;

try
...
except
end;
....????
 
>>而Except是只有出错就释放,它不必等到最后.
你有没有搞错!!!!![:(!]
xx := Txx.Create
try
//Do something
excetp
[h1]end;
xx.Free;
[/h1]
在 except end 之后才释放!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Kingron,
说什么呢?莫名其妙的?
 
to com :
是啊,我不懂编程,就你行,哦,知道自己问的什么问题嘛,
上帝啊,告诉我,为什么我和狗长得不一样啊?!我没尾巴,我还没它跑得快!
 
拜托!不要那么激动嘛.写错了,应该是触发,难道我还没用过try...except?
我的意思是你试一下,将出错那一句放在最后一个循环上,看看时间差距会是多少?假如差不
多,那恐怕就是这个原因,假如还是3倍,就再找其它原因.
 
Kingron
我明白你的意思了,可我相信没有几个人这么用,会引起歧义
 
呵呵,
两者当然不同,
加入这两个东西只是为了提高程序的健壮性而不是效率
(1)
try
...
finally
end;
(2)
try
...
except
end;
我的经验是(1)与(2)的主要区别在以下几点:
1.(2)是用于扑捉异常,(1)是用于保证代码执行的完整性
2.(1)中finally处的代码不管什么情况都会被执行,(2)中except处的代码仅在发生异常时才会执行
3.对它们的使用范围的不同,代码的效率和意义也不尽相同
 你的用例中只是为了测试效率的区别,而在实际应用中,
一般是不会把它们放在一个循环中的,而是把循环体包含在其中,
 这样,两者的效率及与不要两者差别是很小的,
但加上后带来的可靠性及编程的方便性却是不加所无法相比的。
 
liangdewei
不用自卑你不如狗,你会咬人呀!!!比狗还凶呢!!!

carryon
try finally之间的代码虽可保证finally 和 end之间的程序能执行,但不能保证程序不崩溃,
而try except就不会使程序崩溃
 
com:
好象delphi的文档中重来没说明过try finally是用来保证程序不崩溃的
它与try except是功能是不同的,
  希望你能再看一看帮助是怎么说明的(sorry,我这没有环境)
 
我用finally的时候,一般都在 finally...end 之间使用 try..except...end 释放资源,以确保
万无一失,另外,我常常在 try...finally 之间使用 exit,这样,即使出现特殊情况也能保证
finally 之后的语句能够被执行。

关于开销:
您怎么不看一看汇编代码呢?
如果一定要用到异常处理,开销是必然的。finally和except都有其各自的用处,对它们进行比较
是不合适的。
 
两者的目的不同,所以没有可比性
try...finally是为了确保某一段代码必需执行,不管你有没有异常
try...except只是为了处理异常而已。
正如你所说的“try finally之间的代码虽可保证finally 和 end之间的程序能执行,但不能保证程序不崩溃,
而try except就不会使程序崩溃”,所以这两者都得存在。
至于为什么用
try
finally
Resource.Free;
end;
而不用
try
except
end;
Resource.Free;
Kingron已经举了个很好的例子,这在效果上看起来确实是一样的,但当你的代码复杂起来
的时候,谁又能确保不在try..except块中加个Exit语句呢?所以这对代码的可维护性来说
是非常不好的。
 
强烈赞同carryon大侠的话!
 
如果在写文件时出错,没有try,看你还能存得了盘
 
carryon:完全正确。不是每个时候都追求效率的。保证程序健壮很有必要。没有任何语言的
任何语句能够保证程序不崩溃。试试:
function DoTest(SomeObj: TSomObj);
begin
SomeObj.DoSomeMethod;
end;
如果传过来的对象为空你试试。
不过这个问题讨论起来还是有点意思的。
 
后退
顶部