前几天在黑马论坛上看到有人问try catch finally 的问题,就是try里面的变量不能在catch 和finally 用的问题,其实是作用域不一样,我把自己看的又总结下。
try..catch..finally 的介绍如下:
finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。 控制总是传递给 finally 块,与 try 块的退出方式无关。
catch 用于处理语句块中出现的异常,而 finally 用于保证代码语句块的执行,与前面的 try 块的退出方式无关。
catch 和 finally 一起使用的常见方式是:在 try 块中获取并使用资源,在 catch 块中处理异常情况,并在 finally 块中释放资源。
void ReadFile(int index) { string path = @"c:userspublic est.txt"; char[] buffer = new char[10]; StreamReader file = new StreamReader(path); try { file.ReadBlock(buffer, index, buffer.Length); } catch (IOException e) { Console.WriteLine("Error reading from {0}. Message = {1}", path, e.Message); } finally { if (file != null) { file.Close(); } } }
通常 finally 中的代码只负责清理资源。
那么,如果 finally 中包含业务逻辑,try..finally..的执行顺序会对业务逻辑有怎样的影响呢?
void Main() { Console.WriteLine(TestTryFinally()); } public string TestTryFinally() { string x = "init"; try { x = "try"; return x; } finally { x = "finally"; } }
这里的执行顺序是:
- 执行 return 之前的代码
- 对 return 语句求值
- 执行 finally 中的代码
- 在第 2 步中的求值结果被返回
所以,具体是否对返回值有影响,得看 x 变量的类型。如果是不可变类型,则 finally 中的代码对 return 的求值结果没有任何影响。而如果是可变类型,则 finally 中的代码会改变 return 求值结果的内容。
上述代码,在 x 类型为 string 时,返回值为 "try"。