【问题标题】:In .NET, is finally equivalent to try-catch-throw?在.NET中,终于等价于try-catch-throw吗?
【发布时间】:2013-05-11 10:23:51
【问题描述】:

我正在为 CIL 编写一个静态分析工具。如果 finally 块可以被解释为 try-catch 块并在 catch 内重新抛出,则控制流分析将被简化。 在 C# 中,我看不到

之间的区别
try
{
    // ...
}
finally
{
    // finally code here
}

try
{
    // ...
}
catch
{
    // finally code here
    throw;
}

或之间

try
{
    // ...
}
catch(Exception e)
{
    // catch code here
}
finally
{
    // finally code here
}

try
{
    try
    {
        // ...
    }
    catch (Exception e)
    {
        // catch code here
    }
}
catch
{
    // finally code here
    throw;
}

CIL 中甚至还有 finally 块和 endfinally 指令。一定有区别吧?

【问题讨论】:

    标签: c# .net cil


    【解决方案1】:

    否 - 即使没有抛出异常,也会执行 finally 块,并且即使另一个 catch 块捕获到异常,。 (不管catch 块本身是否抛出异常都是如此。)

    哦,如果try 块从方法返回,finally 块将被执行。

    基本上,如果您希望代码在执行离开语句时始终执行,finally 就是您想要的。尽管在 C# 中我发现我很少编写显式的 finally 块 - using 语句几乎总是使代码更简单。

    【讨论】:

      【解决方案2】:

      补充 Jon 的——当然是正确的——回答:你实际上是在描述一个 try-fault 块。也就是说,try-fault 块相当于try 后跟catch-everything 和自动重新throw

      C# 不支持 try-fault 块,但 CIL 支持,因此,如果您曾经阅读 IL 并看到 fault 块,现在您知道它是什么了。

      另外,正确的说法

      try{} 
      catch {} 
      finally {}
      

      等价于

      try 
      { 
          try { } 
          catch { } 
      } 
      finally { }
      

      事实上,它在 C# 编译器内部就是这样做的;所有 try-catch-finally 块都被重写为 try-finally 内的嵌套 try-catch。这是一个简化的假设,有助于编写静态分析器。

      【讨论】:

        猜你喜欢
        • 2020-12-19
        • 1970-01-01
        • 2019-09-09
        • 2010-12-14
        • 2011-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-23
        相关资源
        最近更新 更多