finally语句存在有何理由?
try
{
}
catch
{
}
finally
{
}
如果try中的语句执行没出错,执行完后
执行finally中的语句,如果有错执行catch中的语句
再执行finally中的语句?
为什么要这么做呢?
如果finally语句只是我上述所说的功能完全可以去掉啊?
只保留try{},catch{}语句,
反正它都是在try和catch执行完后再执行,
我在这两个语句下面写跟在finally中写
有什么区别?
问题点数:20、回复次数:28Top
1 楼Yok(黄旭)回复于 2004-05-03 21:48:48 得分 0
finally能保证他被执行
try里面任何跳转语句都不能阻止finally被执行Top
2 楼lxcc()回复于 2004-05-03 22:01:07 得分 0
finally保证出错后能做一些善后工作Top
3 楼chenyuming2004(这辈子我算是废了)回复于 2004-05-03 22:08:57 得分 0
Yok(黄旭) ( )
finally能保证他被执行
try里面任何跳转语句都不能阻止finally被执行
的意思是不是说在try或catch里面即使有goto或return等语句,
也会执行完finally后才会跳转?Top
4 楼erictang2003()回复于 2004-05-03 22:16:51 得分 0
最有用的是,即使抛出异常,仍然可以在finally中
-> 关闭数据库连接,
-> 清理占用资源Top
5 楼byx45(byx45)回复于 2004-05-03 22:54:46 得分 0
1、在catch语句里可能有Return语句,这种情况下,finally的语句也会先执行,再跳回。
2、正常情况下,没有return的话,语句会顺序的执行。但很多情形,发生异常需要跳出当前的方法。Top
6 楼SimerJoe(浪月)回复于 2004-05-04 08:54:10 得分 0
如果需要关闭数据库。文件。网络的连接finally是最合适的。
不管是否出错,它都会执行。Top
7 楼Yok(黄旭)回复于 2004-05-04 19:11:20 得分 1
>>的意思是不是说在try或catch里面即使有goto或return等语句,
>>也会执行完finally后才会跳转?
对.除非在finally又出现了异常
Top
8 楼zag(智格)回复于 2004-05-04 19:26:31 得分 1
finally语句中可执行catch之后的语句,也就是说即使发生异常也能执行。这对于一些资源的即时释放是很有帮助的。Top
9 楼musicllm(编程雨生)回复于 2004-05-04 20:05:13 得分 1
你return试试Top
10 楼yzx110(原振侠)回复于 2004-05-05 13:03:09 得分 1
实际上有些地方看起来确实没必要用finally
但是如果你写一个API,这个API需要用到一些非托管资源,又可能抛出异常,这时候finally就有用了
比如try{} finally{},如果有异常抛出finally就可以清理资源,并且这个API的外部能够准确捕获到这个异常,如果你只用try{}catch{}的话,你虽然能够清理资源,但却不能正确把情况反映给用户(虽然你可以再次throw,但这是不是增加了编程的负担?)。Top
11 楼chenyu001(天使之恋)回复于 2004-05-05 22:25:38 得分 1
finally 主要是做一些善后工作的
在一般的操作中 本人是很少用到Top
12 楼Sunmast(速马@Redmond, WA)回复于 2004-05-05 22:31:01 得分 0
主要用于减少重复代码
比如你打开了一个FileStream fs
如果不用finally{}的那应该就是
try
{
...
fs.Close();
}
catch
{
...
fs.Close();
}
这样才能保证stream总是关闭
但是如果用finally
那就是
try
{
...
}
catch
{
...
}
finally
{
fs.Close();
}
这样省得写两次fs.Close();
实际情况可能更为复杂
使用finally{}可以把最后处理现场的代码写到一起,清晰而易于维护Top
13 楼Ninputer(装配脑袋)回复于 2004-05-07 14:18:39 得分 0
finally很少和catch一起出现,因此一旦他们同时出现,要么是一种高级设计,要么是不良设计。
如果没有catch,只有finally,那么finally的作用是十分明显的!你自己思考看看。Top
14 楼outrace(欧阳云天)回复于 2004-05-07 14:26:41 得分 1
to Ninputer(装配脑袋)
为什么说“一旦他们同时出现,要么是一种高级设计,要么是不良设计。”
主要是为什么是不良设计
个人感觉
try
{
...
}
catch
{
...
}
finally
{
…
}
是对所有有可能产生错误的地方的标准眶架。
怎么会没有用呢?Top
15 楼huangsuipeng(hsp|I love foxpig)回复于 2004-05-07 14:33:33 得分 0
大家都说了呢Top
16 楼vzxq(灵感人)回复于 2004-05-07 17:47:56 得分 1
这也不明白,如果没有finally 出错后,就停止运行程序了,这样一些连接得不到释放。Top
17 楼Ninputer(装配脑袋)回复于 2004-05-08 19:59:57 得分 0
我是以实际经验而言,因为如果所有的异常都被Catch,Finally那里的代码即时放到try块外部也会被执行,如
try{
}
catch(Exception){
}
finally {
//这里的代码放一个finally块和没放一个样!
}
但如果没有catch,那么finally块的作用非常明了:
try{
//code here
}
finally{
//若Try部分发生了异常,控制权就会向外抛出,但无论抛到哪里
//这里的代码始终会被执行。
}
Top
18 楼Ninputer(装配脑袋)回复于 2004-05-08 20:03:18 得分 0
总之,catch(Exception)这种语句和finally一起出现一眼就可以看出是个不良设计。实际上,catch和finally只有很少情况需要同时出现,而当那个catch只能捕获有限异常或者Try块中有其他跳转语句才需要Catch和try同时出现。Top
19 楼Sunmast(速马@Redmond, WA)回复于 2004-05-08 23:22:17 得分 0
--> catch(Exception)这种语句和finally一起出现一眼就可以看出是个不良设计
不同意
事实上很多情况都是需要的
看我上面那个帖子Top
20 楼Ninputer(装配脑袋)回复于 2004-05-08 23:30:44 得分 0
你那个例子如果将fs.Close()移到try块的外边也一样会执行啊。如果不发生跳转,finally的作用就体现不出来了。Top
21 楼cuijie(cuijie)回复于 2004-05-09 06:19:21 得分 0
有道理,顶Top
22 楼Sunmast(速马@Redmond, WA)回复于 2004-05-09 11:55:20 得分 2
fs.Close()放到外面.. 有些情况是不行的
有两种情况
一个是try{}catch{}里面函数已经return
一个是catch{}内部可能被设计为再次抛出异常
当然,不过不是这种情况,就无所谓了
但是我还是偏向于使用finally{}
这样子代码更为清晰Top
23 楼Ninputer(装配脑袋)回复于 2004-05-09 12:14:15 得分 2
是啊,return也属于跳转语句,还有goto,出错的代码以及throw等,如果要使用他们,还有必需要执行的代码,就应当使用finally了。Top
24 楼gcs925(竹里坐消无事福,花间补读未完书)回复于 2004-05-09 13:33:07 得分 0
学习Top
25 楼soulroom(易水之风)回复于 2004-05-09 15:00:41 得分 1
finally比catch用的更多Top
26 楼lkal4587()回复于 2004-05-10 22:52:25 得分 1
有些东西 不管 是否发生异常 都要执行呀
Top
27 楼greatsft(C的使者)回复于 2004-05-11 15:06:04 得分 7
1:finally的作用就是你说.当然完全不用finally语句可以吗?有些情况下当然可以,可是
作为一个好的习惯就应该习惯使程序有专业性和完整性.
为什么说是有些情况下呢?比如说一个打开数据库方法:
void OpenDB(){
SqlConnection conn=new SqlConnection(conn_string);
try{
conn.Open();
SqlCommand comm=new SqlCommand();
...
...
conn.close();
}
catch(Exception ee){
MessageBox.Show(ee.Message);
}
}
可是如果在conn.Open()语句后处出现异常,那么直接跳到catch中,
这样就没有办法执行conn.Close();使资源得不到释放!!没有意义!!
相反,如果在后面加上finnally{conn.close()}
那么无论是否运行正常,都将关闭与数据库的连接,释放了部分资源!!
所以很明显可以看出finally还是很有必要的!
wish u good luck
GreatsftTop
28 楼haohaohaohao()回复于 2004-05-12 08:34:11 得分 0
学习中,实在长见识啊!!Top




