gpt4 book ai didi

c# - 为什么 'continue' 语句不能在 'finally' block 内?

转载 作者:IT王子 更新时间:2023-10-29 03:35:12 25 4
gpt4 key购买 nike

我没有问题;我只是好奇。想象一下以下场景:

foreach (var foo in list)
{
try
{
//Some code
}
catch (Exception)
{
//Some more code
}
finally
{
continue;
}
}

这不会编译,因为它会引发 compiler error CS0157 :

Control cannot leave the body of a finally clause

为什么?

最佳答案

finally block 无论是否抛出异常都会运行。如果抛出异常,continue 到底会做什么?您不能继续执行循环,因为未捕获的异常会将控制转移到另一个函数。

即使没有抛出异常,finally 也会在 try/catch block 内的其他控制转移语句运行时运行,例如 return,这会带来同样的问题。

简而言之,根据 finally 的语义,允许将控制权从 finally block 内部转移到它的外部是没有意义的。

用一些替代语义来支持这一点会更加困惑而不是有用,因为有一些简单的解决方法可以使预期的行为更加清晰。所以你得到一个错误,并被迫正确地思考你的问题。这是 C# 中普遍存在的“把你扔进成功的陷阱”的想法。

C#, you, and the out if success

如果您想忽略异常(通常不是一个好主意)并继续执行循环,请使用 catch all block :

foreach ( var in list )
{
try{
//some code
}catch{
continue;
}
}

如果您只想在没有未捕获的异常被抛出时继续,只需将continue放在try-block之外。

关于c# - 为什么 'continue' 语句不能在 'finally' block 内?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17991036/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com