[讨论]从Delphi 里面带过来的 __finally 关键字是否多余?
偶觉得这个 __finally 有些多余,看一下下面的结构:
TMyClass *p ;
try {
p = new TMyClass ;
...
} catch(...) {
...
}
delete p ;
在这里,无论 catch 是有执行还是没有执行,delete p 还是一个样的执行,这个好象跟 __finally 的作用一样。除非是在 try 内部有些错误导致程序无法向下执行,但如果真有这种错误,__finally 似乎也不能幸免。
所以偶觉得 __finally 有些多余,不知道俺的想发是否正确,请各位大侠来指点指点。
问题点数:0、回复次数:19Top
1 楼TR@SOE()回复于 2003-02-03 17:17:18 得分 0
我是这么认为的,
标准的C++里好象是没有__finally的,但是有了它确实很好。Top
2 楼duduwolf(嘟嘟狼)回复于 2003-02-03 17:26:25 得分 0
gzTop
3 楼ilikeff8(迷茫)回复于 2003-02-03 18:14:53 得分 0
给你举个例子,当然你可以不这么做,但这样结构更好
procedure TForm1.Test;
var
i:real;
Edit:TEdit;
begin
Edit:=TEdit.Create(nil);
try
try
begin
Edit.Text:='0';
i:=1/StrToInt(Edit.Text);
end;
finally
Edit.Free;
end;
except
on Exception do
begin
ShowMessage('wrong');
Exit;
end;
end;
ShowMessage('right');
end;
Top
4 楼ilikeff8(迷茫)回复于 2003-02-03 18:15:31 得分 0
忘了写成bcb的,反正看得懂Top
5 楼langhaixin(C++如此多娇,引无数高手尽折腰!)回复于 2003-02-03 22:04:29 得分 0
同感ing 觉得finally 没有多少实用,Top
6 楼warton(创业群13734424 http://www.anywhy.cn)回复于 2003-02-04 12:51:29 得分 0
to ilikeff8(迷茫) 你的程序这样处理异常并不可取,记得csdn有篇文章,讲eiffel的异常的,我觉得不错,你们看看Top
7 楼oyxiaoyu0(小雨仔)回复于 2003-02-04 13:25:13 得分 0
交给CPU处理Top
8 楼cupidvenus(小鱼儿)回复于 2003-02-04 13:47:22 得分 0
否Top
9 楼meCAD(重建CHINABCB.COM论坛(QQ群:13252194))回复于 2003-02-04 13:52:22 得分 0
学习Top
10 楼tiegerium(/*唐秀观*/)回复于 2003-02-05 20:14:38 得分 0
他妈的Java和C#有__finally关键字,std C++没有,你try了,__finally
总是被执行,我不想用。Top
11 楼Adayuer(饭碗饭碗饭碗你在哪里?)回复于 2003-02-06 16:31:33 得分 0
学习Top
12 楼pazee(耙子)(今年过年不收礼,收礼只收尿不湿)回复于 2003-02-06 16:43:13 得分 0
__finally 的确可以没有,他完全可以被try ...catch实现,但是有了他更方便,起码书写的逻辑更容易理解了。
可能类似:
有了 "或" 和 "非" 可以不用 "与",但是"与"一样也有了,因为方便;
有了减法可以没有加法,但是加法还是有着方便;
for, while, do 都可以用 while来替代,但是有了这些,更方便了。Top
13 楼copy_paste(木石三)回复于 2003-02-06 17:04:46 得分 0
__finally俺不觉得多余,相反在没有的话,我真不知道很多情况下怎么处理。特别是异常的情况的。
HANDLE H = CreateFile(...);
try
{
//#1
if (TRUE)
throw Exception("Error, Some message");
}
__finally
{
CloseHandle(H);
}
return;
如上#1的地方,需要一个抛出异常的情况,如果没有__finally,也许可以写成:
HANDLE H = CreateFile(...);
try
{
//#1
if (TRUE)
throw Exception("Error, Some message");
...
// 正常 ...
CloseHandle(H);
return;
}
catch(...)
{
CloseHandle(H);
return;
}
一般异常的用法不是这样,至少我不是这样用的,
我不用去显示的截取异常,只会去抛出一个异常,告诉程序,有一个错误发生,我要中止运行程序了,而不是使用“return”来返回,"return"是无条件返回,有些资源被Create了,但因为没有使用__finally结构,中间出现了一个错误,使用了return就返回。(感觉是不负责任)
像:
#1
HANDLE H1 = CreateFile(...);
if (INVALID_HANDLE_VALUE == H1)
{
MessageBox(...);
return;
}
#2
HANDLE H2 = CreateFile(...);
if (INVALID_HANDLE_VALUE == H2)
{
MessageBox(...);
return;
}
#1中出错了无可非议,但#2那里出错了,它也如此,它应该CloseHandle(H1)再return,
只是举个例子,因为程序有时比较复杂,你能保证面面俱到的保护每个Create后的资源都释放掉了吗?而且用了__finally你的程序结构会简洁了很多,所以我会跟其它人说:建议使用try __finally结构。
而且我不会使用:
try
{
}
catch(...)
{
//在这里我不会截取异常,我只会再抛出一个自己的异常,或改变异常的信息
//异常自有它的用处,Delphi, VC, C#基本上都有了自己的异常处理机制,
//我们要做的是抛出一个异常, 而不是截取异常。
throw Exception("Error, My Message");
}
不管是win32和Console的程序,都有自己异常机制,而自己再去做一次,真是有点浪费。。。Top
14 楼ffww(疯子)回复于 2003-02-07 17:04:57 得分 0
__finally无论try有没有异常抛出来,都会被执行Top
15 楼BCB(天下三分明月夜,二分无赖是扬州)回复于 2003-02-07 20:36:53 得分 0
楼上的情况:
try
{
}
catch(...)
{
}
// ----下面代码无论怎样都会执行,__finally有何用
...........
Top
16 楼copy_paste(木石三)回复于 2003-02-07 21:53:43 得分 0
try
{
}
catch(...)
{
//在这里重新抛出异常,而不是截取异常。
Error proc;
throw; // 重新将异常抛出。
// or throw MyException(....);
}
我从来不认为应该在catch中截取异常,而是自己抛出异常。
不管什么异常都是设计者设计抛出的,如果按try catch思想,那是永远不会有异常出来了,那要throw, try catch, __finally做什么。
异常作用就是最外层有一层try catch,将没人管的异常MessageBox or printf出来,这就是异常,__finally的作用是在异常发生时,将资源正当的释放,VCL的Application, Console的最外层都有这一层,VC,C#也有(VB不知有没异常,Unknow)Top
17 楼Behard(我爱天安门)回复于 2003-02-08 09:22:17 得分 0
__finally
是 Delphi 带入 BCB 的,C++ 没有
两种做法都有理由,但是只使用 C/C++ 的人建议不使用 __finally
【我认为这只是习惯】
没有
try{}
catch(...){}
__finally{}
的Top
18 楼deavilness(俠盜裸奔漢)回复于 2003-02-09 09:41:26 得分 0
精彩!!!
学习!!!Top
19 楼ShanShiMin(Delphi+C#=我的最爱)回复于 2003-02-09 09:47:46 得分 0
个人认为Finally还是比较实用的,但如果能够使用try...except...finally嵌套的话,效果将会更好Top





