这两条try语句有什么区别 try...finally...except 和 try...except...finally(50分)

  • 主题发起人 主题发起人 delphi 首富
  • 开始时间 开始时间
D

delphi 首富

Unregistered / Unconfirmed
GUEST, unregistred user!
try try
...
finally // wrap up
...
end
// try/finally
except
on e: Exception do
ShowMessage(e.Message);
end
// try/except



try try
...
except
on e: Exception do
ShowMessage(e.Message);
end
// try/except
finally // wrap up
...
end
// try/finally
 
你要记住
try
程序段一
finall
程序段二
end;
就算在程序段一出现异常也执行程序段二,而
try
程序段一
except
程序段二
end;
在程序段一出现异常则不执行程序段二
 
to mlzhou
你写错了吧,
try
程序段一
except
程序段二
end;
在程序段一出现异常则不执行程序段二 ??????

还请你注意,我并不是要知道finally 和except的具体用意,我是要知道当它们复合后的意义,
以及它们在次序上的不同所带来的差异, 谢谢
 
你觉得第二种组合有必要吗?实际中你用过这种组合吗?
try
try
......
except
...
end;
finally
代码1;
end;
就算没有try finally结构,代码1仍然能够正常运行。
 
to 教父
谢谢,你提醒了我,也许答案就是:没有必要,我确实是没用过
但是你能谈谈第一种语句的组合含义吗
 
是我写错了,我忘了加 on e: Exception do ,sorry.
try try
...
finally // wrap up
程序段二
end
// try/finally
except
on e: Exception do
ShowMessage(e.Message);
end
// try/except
内层的try...finally总是确保程序段二被执行,不管是不是发生了异常。

try try
...
except
on e: Exception do
ShowMessage(e.Message);
end
// try/except
finally // wrap up
程序段二
end
// try/finally
只要发生了异常,程序段二就不被执行。

以关闭文件为例,程序段二代表 closefile(F)
在第一种情况下,文件总能关闭,并且异常总能得到处理。


 
try ... finally... 不论try部分内容是否出错都执行每部分内容
try ... except... 当运行try部分内容出错时,会跳至except处运行异常情况代码
 
说实话,第二个没用呀!
 
to mlzhou:
我试验过了,第二种try语句的finally部分无论异常发生与否都会被执行,和第一种只是次序
的不同。 还是谢谢你的热心

to mlzhou, 教父:
“第二种没用”
如果抽取了第二种里的try。。except,那剩下的就是普通的try。。finally,如果说它没用
,无论异常发生与否都会执行,那么还要它干什么?
谢谢两位
 
如果没有更好的答案,我将结贴
 
try try
程序段一
except
on e: Exception do
ShowMessage(e.Message);
end
// try/except
finally // wrap up
程序段二
end
// try/finally

你确定当程序段一发生异常时,程序段二能执行吗?(我手头没有环境,测试不了)
 
try
try
raise Exception.Create('Error');
except
ShowMessage('except');
end;
finally
ShowMessage('finally');
end;

try
try
raise Exception.Create('Error');
finally
ShowMessage('finally');
end;
except
ShowMessage('Except');
end;
我觉得两种程序都没有问题,更不是什么没有用?只是执行的先后次序不同。
如果你在第一段的双try里创建了资源,然后又可能会发生异常,这时可以保证你资源释放之前就捕获异常。
如果你在第二段的双try里创建了资源,然后又可能会发生异常,这时可以先捕获异常然后在释放资源。
 
>>如果抽取了第二种里的try。。except,那剩下的就是普通的try。。finally,如果说它没用
>>,无论异常发生与否都会执行,那么还要它干什么?
try except主要用于捕捉并自己处理异常,而finally并不处理异常,只是在异常发生后,
在提交给系统前有机会做一点自己的善后工作。
比如在一个循环中,如果对try except的话,循环可以继续下去,而用finally则不行。
至于上述的嵌套,我在实际中很少用到,如果有的话,也可能是你的编码有问题,通过
调整逻辑应该可以不需要嵌套。
 
to 教父:
有道理,考虑中,第二种嵌套确实比较少见,就是不知道为什么每人采用它。
准备给分。能说说嵌套的例子吗。
不过我觉得 你话里的意思还是:try。。。finally是个
多余的语句
 
我没有说finally是多余的啊,他可以保证资源能够被释放,大大地有用,呵呵。
finally不是不可替代,比如在C++中就没有,但是它有时还是比较方便的。
还有一个和except不同的地方是没有异常的地方它也有用,比如你在if false时
要跳出某段函数,但是前面又申请了资源的话,你要在每个退出的地方都要释放
资源,但是如果用了finally就没问题了,你的exit也必须执行完了其中的代码才
行。
至于嵌套的例子真的很少用到,一下子想不出来。
 
to 教父:
我领会到了你的意思,1。finally自己并不处理异常,它只是在异常发生时有机会处理一些
善后工作。2。finally和except不同的地方是没有异常的地方它也有用,比如你在if false时
要跳出某段函数,但是前面又申请了资源的话,你要在每个退出的地方都要释放资源,但是如
果用了finally就没问题了,你的exit也必须执行完了其中的代码才行。
同时我更正一下你的这个观点:
>> try
>> try
>> ......
>> except
>> ...
>> end;
>> finally
>> 代码1;
>> end;
>> 就算没有try finally结构,代码1仍然能够正常运行。
我就是上述的话才觉得你是说try。。。 finally是个多余的语句,但是假设有这种情况呢,
抛出了一个异常,而内层的except并不能捕获,控制就要交给系统,如果不用外层的finally
怎么能保证善后工作被处理?

所以,综上所述,我作出分析:
这两种语句都有它们的价值。
第一种,在异常处理前处理善后,不管异常处理变成什么情况,第二种,在异常处理后处理善后,即使自己不能捕获异常
它们的作用都是在当发生不可预料的事,而你又无法处理。只是侧重在异常与善后的处理关系。
因此zejun_yao没错,加十分。

在此谢谢教父, 讲的非常好,长知识。
不过真的还想再放上几天,看看还有没有更多的意见


 
我的这个问题提出是因为我看到了coderush的code模板中有try。。。finally。。。except,
而没有try。。except。。。finally
 
>>抛出了一个异常,而内层的except并不能捕获
对,我忘了这种情况,呵呵,不过这种情况不多见,我只听说过,但没碰到过,据说是
一些VCL方面的错误execpt捕捉不到。
 
听了大家的讲课,真是长见识[:)]
 
多人接受答案了。
 
后退
顶部