What is the point of finally in a try catch/except finally statement
多年来,我一直在许多语言中使用try-catch/except-finally变体,今天有人问我最终的目的是什么,我无法回答。
基本上,为什么您最终要放入一个语句而不只是在整个try-catch块之后放入它?或者换句话说,以下代码块之间是否存在差异:
1 2 3 4 5 6 7 8
| try{ //a}
catch {//b}
finally {//c}
try{//a}
catch{//b}
//c |
编辑:人们,我知道最后要做什么,我已经使用它很多年了,但我的问题是,在上面的例子中,把//c放进去似乎是多余的,不是吗?
Finally块的目的是确保代码在三种情况下运行,这三种情况下仅使用"catch"块无法非常干净地处理:
如果"try"块中的代码通过返回退出`
如果catch块中的代码重新引发捕获的异常,或者(意外或故意)最终抛出一个新的异常。
如果"try"块中的代码遇到没有catch的异常。我们可以在每个return或throw之前复制Finally代码,并在自己的try/catch中包装catch块,以允许发生意外异常的可能性,但放弃所有这些并简单地使用Finally块要容易得多。
顺便说一句,我希望语言设计人员包括一个exception参数到Finally块,以处理在异常之后需要清理但仍希望它渗透到调用堆栈的情况(例如,可以将构造函数的代码包装在这样一个缺点中)truct和Dispose,如果构造函数将异常退出,则表示正在构建的对象)。
- 我们试过了,你接住了,我们终于有了这个问题的答案!
- 我认为这里的关键是,即使在try/catch语句中有一个return语句,它也会执行。如果没有这样的理解,一个finally子句就显得微不足道,因为它知道catch all基本上允许try/catch块后的代码执行,而不考虑异常。多谢,@supercat!
- @旋转:在一个捕获案例中,返回和(通常是重新抛出)异常都比不使用finally更容易处理。
即使在try块中引发异常,也会执行finally块。因此,例如,如果您以前打开过流,您可能希望关闭该流,不管是否引发异常。最后,块对于这样的问题是有用的。
Finally确保您的代码被执行,即使您得到一个异常。
finally块对于清除try块中分配的任何资源以及运行任何必须执行的代码(即使存在异常)都很有用。
http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx
- 但是我提到的两个代码块有什么区别?在这两种情况下,执行//c,对吗?
- 向下投票请评论
- 请查看编辑后的问题。
- @ali-finally块允许您清理分配的任何资源,如果您不在本地处理except,则允许exception支持调用堆栈。
- 在第二个版本中,如果//中的代码调用了"return"以退出函数,则不会执行//c。最后确保调用了//C,即使函数提前退出。…schwehr.org/blog/archives/2012-03.html_e2012-03-01t13_11_15.‌&8203;txt
- @阿里,我不相信你理解答案(或者,我怀疑,是finally)。您编辑的澄清不会改变问题。
- 不回答实际问题。