• 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: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";
          }
        }

    这里的执行顺序是:

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

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

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

  • 相关阅读:
    《机器学习》周志华 习题答案8.5
    《机器学习》周志华 习题答案8.3
    《机器学习》周志华 习题答案7.3
    《机器学习》周志华 习题答案6.2
    《机器学习》周志华 习题答案4.3
    Python使用wxPython、py2exe编写桌面程序-乾颐堂
    python生成验证码,文字转换为图片-乾颐堂
    python使用wmi模块获取windows下的系统信息监控系统-乾颐堂
    Python图像处理库:Pillow 初级教程-乾颐堂
    python的metaclass浅析-乾颐堂
  • 原文地址:https://www.cnblogs.com/kounian/p/3384770.html
Copyright © 2020-2023  润新知