【问题标题】:Relationship between return keyword and finally keyword in c# [duplicate]c#中return关键字和finally关键字之间的关系[重复]
【发布时间】:2013-09-24 03:05:53
【问题描述】:

我想找出“return”和“finally”关键字之间的关系。执行顺序是什么,发生异常并在代码块执行某些操作后调用return关键字时会发生什么情况,如果有两个嵌套的finally块如下所示,

        try
        {
            try
            {

            }
            catch (Exception)
            {
                //do some stuff
                return;
            }
            finally
            {

            }
        }
        catch (Exception)
        {

        }
        finally
        {

        }

【问题讨论】:

  • 为什么不打开一个 C# 项目并尝试一下?你已经有了代码。
  • 两个finally都会被执行,从最里面到最外面。
  • 他们没有关系
  • 有关系,不懂这个基本原理的请不要评论提问

标签: c# exception-handling


【解决方案1】:

来自MSDN

通常,finally 块的语句在控制离开 try 语句时执行,无论控制转移是由于正常执行还是执行 breakcontinuegotoreturn 语句,或将 exception 传播到 try 语句之外.

在您的示例中,两个 finally 块都将执行。内部的会先执行,然后外部的 finally 会执行。

【讨论】:

  • 为什么这被否决了?这似乎是一个正确的答案。
  • 是的,我也在想同样的事情。
  • 我不小心投了反对票。这是你说的正确答案
【解决方案2】:

finally 表示运行此代码无论发生什么

随便可能意味着returncatch

【讨论】:

    【解决方案3】:

    最后总是被执行。无论您是否遇到异常,您的 finally 块都会执行。在您的情况下,您的两个 finall 块都将被执行。

    【讨论】:

      【解决方案4】:

      如果内部 try 块中发生错误,控件将转到内部 catch 块,然后是内部 finally ,然后是外部 finally,然后返回您在内部 catch 块中执行的值。

      尝试调试代码,你会得到流程

      【讨论】:

        【解决方案5】:

        即使出现异常,finally 块也将始终执行。要理解考虑下面的代码

            try
            {
            //sql connection opened
            //execute a query ----> EXCEPTION OCCURRED HERE 
        
        //return the result
            }catch(Exception ex)
            {
            throw ex;
            }
            finally{
            //close the connection
            }
        

        上面是演示finally块广泛使用场景的代码。即使在执行查询时发生异常,也必须关闭与数据库的连接。

        如果没有异常,finally块也会执行,然后返回结果

        【讨论】:

          【解决方案6】:

          无论发生什么,finally块都会被执行。 就 return 而言,如果一个 try 块包含一个 return,它实际上会执行一些操作,例如将其存储在某个变量中,然后返回它在最后,在 finally 块执行之后。像这样:

          try{
              return xyz; //(i.e, temp = xyz;)
              }
          catch() {}
          finally {}
          return temp;
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-08-14
            • 1970-01-01
            • 1970-01-01
            • 2012-12-09
            • 2019-01-17
            • 2014-04-18
            • 2019-07-06
            相关资源
            最近更新 更多