为什么这个“finally”执行?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (26)

如果你运行下面的代码,它实际上会在每次调用goto后执行finally:

    int i = 0;
Found:
    i++;
    try
    {
        throw new Exception();
    }
    catch (Exception)
    {
        goto Found;
    }
    finally
    {
        Console.Write("{0}\t", i);
    }

为什么?

提问于
用户回答回答于

你为什么期望它不执行?

如果你有try / catch / finally或者try / finally块,那么无论你在try或catch块中 大部分时间可能有什么代码,finally块都会执行。

考虑'返回',而不是转到。

//imagine this try/catch/finally block is inside a function with return type of bool. 
try
{
    throw new Exception();
}
catch (Exception)
{
    return false; //Let's say you put a return here, finally block still executes.
}
finally
{
    Console.WriteLine("I am in finally!");
}
用户回答回答于

以下文本来自C#语言规范8.9.3 goto语句

goto语句执行如下:

  • 如果goto语句退出一个或多个具有关联的finally块的try块,则控制最初将传送到最内层try语句的finally块中。当和如果控制到达finally块的结束点时,控制权将转移到下一个包含try语句的finally块中。重复这个过程,直到所有中间try语句的finally块都被执行完毕。
  • 控制转移到goto语句的目标。

所属标签

可能回答问题的人

  • 爸爸

    腾讯 · 客户端安全 (已认证)

    4 粉丝4 提问5 回答
  • 找虫虫

    0 粉丝0 提问5 回答
  • 不吃貓的鱼oo

    5 粉丝466 提问4 回答
  • uncle_light

    5 粉丝518 提问4 回答

扫码关注云+社区

领取腾讯云代金券