在.NET中,最终相当于try-catch-throw?

时间:2013-05-11 10:23:52

标签: c# .net cil

我正在为CIL编写一个静态分析工具。如果finally块可以被解释为在catch中具有重新抛出的try-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中甚至还有一个最终块和最终指令。必须有区别,是吗?

2 个答案:

答案 0 :(得分:14)

否 - 即使没有抛出异常,也会执行finally块,即使另一个catch块捕获到异常,。 (无论catch块是否会自行抛出异常,都是如此。)

哦,如果finally块从方法返回,则<{1}}块 也会执行

基本上,如果您希望代码在执行离开语句时始终执行,try就是您想要的。虽然在C#中我发现我很少写一个明确的finally块 - finally语句几乎总是使代码更简单。

答案 1 :(得分:13)

添加到Jon的 - 当然是正确的 - 回答:您实际上是在描述try-fault块。也就是说,try-fault块相当于try后跟catch - 所有内容并自动重新throw

C#不支持try-fault块,但CIL确实如此,所以如果您正在阅读IL并且看到fault块,现在您就知道它是什么了。

此外,正确的说法

try{} 
catch {} 
finally {}

相当于

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

事实上,在C#编译器中,它的作用是什么;所有try-catch-finally块都被重写为try-finally中的嵌套try-catch。这是一个简化的假设,在编写静态分析器时可以提供帮助。