一、MSDN中对try-finally语句的解释
finally 块用于清除 try 块中分配的任何资源,以及运行任何即使在发生异常时也必须执行的代码。控制总是传递给 finally 块,与 try 块的退出方式无关。
备注
catch 用于处理语句块中出现的异常,而 finally 用于保证代码语句块的执行,与前面的 try 块的退出方式无关。
二、案例说明
在此例中,有一个导致异常的无效转换语句。当运行程序时,您收到一条运行时错误信息,但 finally 子句仍继续执行并显示输出。
1、案例代码
-
using System;
-
using System.Collections.Generic;
-
using System.Linq;
-
using System.Text;
-
namespace Finally_test
-
{
- class Program
- {
- static int i = 123;
- static string s = "Some string";
- static object o = s;
- static void Main(string[] args)
- {
- Test_Exception_Function();
- Console.WriteLine("in Main,After Excute Test_Exception_Function........!");
- Console.ReadLine();
- }
- static void Test_Exception_Function()
- {
- try
- {
- // Invalid conversion; o contains a string not an int
- i = (int)o;
- }
- catch (Exception InvalidException)
- {
- Console.WriteLine("Find Exception in catch " + InvalidException.ToString());
- Console.ReadLine();
- return;
- }
- finally
- {
- /* 如果上面的异常成立,finally里的语句先被执行,才执行return */
- Console.Write("in finally打印 : i = {0}", i);
- Console.ReadLine();
- }
- /* 如果上面的异常成立, 这个控制台语句,直接被跳过 */
- Console.WriteLine(" End of Test_Exception_Function ");
- }
- }
- }
2、执行效果图
三、结论
使用了finally,即使catch中使用Return,还是先会执行完finaly中的语句才会跳出子过程。
上面Test_Exception_Function函数中,try catch finally语句块后的Console.WriteLine(" End of Test_Exception_Function "); 就被无辜的跳过了,直接不执行。