关于异常处理:最后在try catch / finally语句中有什么意义

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块中引发异常,也会执行finally块。因此,例如,如果您以前打开过流,您可能希望关闭该流,不管是否引发异常。最后,块对于这样的问题是有用的。


    Finally确保您的代码被执行,即使您得到一个异常。

    finally块对于清除try块中分配的任何资源以及运行任何必须执行的代码(即使存在异常)都很有用。

    http://msdn.microsoft.com/en-us/library/zwc8s4fz(v=vs.80).aspx