catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。
finally 块用于清理try块分配的任何资源,无论try中是否异常或者终止(return),finally块都会执行。
如果在finally块中修改了返回值,会对最终返回的结果有何影响呢?
1,如果返回值是值类型
//finally执行,i值是2013,但是最终返回2015 static int test() { int i = 2016; try { i=2015; return i; } catch { //有异常才会到这里 i=2014;
return i; } finally { i=2013; } }
2,返回string类型,是否会影响呢,答案是不会影响。
//finally块执行,s值是“tiger”,但是最终返回dog static string test() { string s = "cat"; try { s="dog"; return s; } catch {
//有异常才会到这里
s="duck";
return s;
} finally { s="tiger"; } }
3,返回数组又会如何呢?
//finally块执行,影响了最终返回结果,返回{ "e", "b", "c" }; static string[] test() { string[] arr = { "a", "b", "c" }; try { arr[0]="d"; return arr; } catch { //有异常才会到这里 arr[0]="f";
return arr; } finally { arr[0]="e";; } }
4,对象跟数组一样,finally修改对象后,最终返回的是finally修改后的对象。
注意:
1,finally块中不能有 return语句,当然vs会报错。
2,如果finally块之后还有return语句,该如何返回呢?即 try{ }catch(){} finally{} return x;
finally块肯定执行,这里主要看try和catch是否执行了return语句,如果执行了,finally块后面的语句就不执行了。
当然,如果try和catch块都含有return语句,那么肯定会执行其中一个,finally块后面的的语句就不会执行了,这是vs会提示“检测到无法访问的代码”,
示例
//返回“dog”,加入有异常会返回“duck”, static string test() { string s = "cat"; try { s="dog"; return s; } catch { //有异常才会到这里 s="duck"; } finally { s="tiger"; } return s;//假如try正确返回了,就不会执行。 }