try catch finally的理解

 

前几天在黑马论坛上看到有人问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:\users\public\test.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";
      }
    }

这里的执行顺序是:

  1. 执行 return 之前的代码
  2. 对 return 语句求值
  3. 执行 finally 中的代码
  4. 在第 2 步中的求值结果被返回

所以,具体是否对返回值有影响,得看 x 变量的类型。如果是不可变类型,则 finally 中的代码对 return 的求值结果没有任何影响。而如果是可变类型,则 finally 中的代码会改变 return 求值结果的内容。

上述代码,在 x 类型为 string 时,返回值为 "try"。

 

posted @ 2013-10-23 19:03  勿念  阅读(376)  评论(0编辑  收藏  举报