最后在try catch / finally语句除外的意义是什么?
多年来,我已经在很多语言中使用了try-catch / except-finally变体,今天有人问我最后是什么意思,我无法回答。
基本上,你为什么最后要发表声明,而不是把它放在整个try-catch块之后呢? 换句话说,下面的代码块有区别:
try{ //a} catch {//b} finally {//c} try{//a} catch{//b} //c
编辑:
人们,我终于明白了,我已经使用了很长时间了,但是我的问题是在上面的例子中, //c
最后似乎是多余的,不是吗?
finally
块的目的是为了确保代码在三种情况下运行,而这些情况不会很干净地只用“catch”块来处理:
- 如果`try`块中的代码通过`return`退出
- 如果catch块内的代码重新抛出捕获到的exception,或者 – 意外或故意 – 最后抛出一个新的exception。
- 如果`try`块中的代码遇到没有捕获的exception。
可以在每次return
或抛出之前复制finally
代码,并在自己的try / catch中包装catch
块以允许意外exception的发生,但是放弃所有这些并简单地使用finally
块就容易得多。
顺便说一句,我希望语言devise师将包括将是一个exception
参数finally
块,以处理的情况下,需要清理exception后,但仍然希望它过滤调用堆栈(例如,可以包装在这样的构造中构造函数的代码,并且如果构造函数将以exception的forms退出,则在构造下Dispose
该对象)。
Finally
确保你的代码被执行,即使你得到一个exception。
finally块用于清理try块中分配的任何资源,以及运行即使有exception也必须执行的任何代码
http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx
最后,即使在try块中抛出exception也会执行块。 因此,例如,如果您以前打开过stream,则可能需要closures该stream或者抛出exception。 最后块对于这样的问题是有用的。