C# 这是为什么;最后";执行?
如果您运行下面的代码,它实际上会在每次调用goto后执行finally:C# 这是为什么;最后";执行?,c#,exception,goto,try-catch-finally,C#,Exception,Goto,Try Catch Finally,如果您运行下面的代码,它实际上会在每次调用goto后执行finally: int i = 0; Found: i++; try { throw new Exception(); } catch (Exception) { goto Found; } finally { Console.Write("{0}\t", i); } 为什么?为什么您希望它不会执行 如
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块都会执行 <> P>而不是Goto,考虑“返回”。p>
//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!");
}
那是故意的。在异常处理程序中,可以执行一些特定于异常的操作。在finally块中,您应该执行资源清理-这就是为什么无论异常处理代码是什么,finally块总是被执行。似乎是合理的。始终在
try
或catch
之后运行finally
块
同样地
try
{
// do something
return;
}
finally
{
// do something else
}
将始终运行
finally
块。编辑-但请参见上面Eric的评论。因为在退出try
(或捕获异常时执行catch
)后,将执行finally
语句。这包括您拨打goto电话的时间。以下文本来自C语言规范()
goto语句执行如下:
- 如果goto语句退出一个或多个带有关联finally块的try块,则控制权最初会转移到最内层try语句的finally块。当控件到达finally块的端点时,控件将转移到下一个封闭try语句的finally块。重复此过程,直到执行了所有中间try语句的最后一个块
- 控件被转移到goto语句的目标
最终运行时,无论程序流程如何。当然,finally
块是可选的,因此,如果您不需要它,就不要使用它。给出的答案的要点是:当控件通过任何方式离开保护区域时,无论是“返回”、“转到”、“中断”、“继续”还是“抛出”,都会执行“finally”。然而,我注意到,几乎每个答案都说“最终块总是运行”最终块并不总是运行。在许多情况下,最终块不运行
谁想把它们都列出来 这是最后一个块的点。它总是执行(相当多)。-1对于使用GOTOI,在生产代码中没有这样做。这只是一个假想的情况。否决投票的主要原因是:我认为这是一个没有意义的问题,在获得超过4k分之后!!!对不起……:)现在你知道答案了,你可以解决这个难题了:给我写一个程序,其中有一个可达的goto,指向一个不可达的标签。-1用于使用goto,真的吗?这一点也不愚蠢。如果你有一个“返回真值”会发生什么在finally块中(对照上面的示例代码)。你得到了什么回报?false还是true?@Pure.Krome,你不能将返回语句放在finally块中。@Pure.Krome,正如Jonathon Watney所说,你会得到一个“编译器错误CS0157:控件不能离开finally子句的主体”。你们也可以看看Eric Lippert的博客文章。我就是从这里得到这个问题的。根据规范,指向SO问题的链接似乎已失效“当控件离开try语句时,始终执行finally块的语句。无论控制传输是作为正常执行的结果发生,还是作为执行break、continue、goto或return语句的结果发生,或者作为从try语句传播异常的结果发生,都是如此。“然而,我认为StackOverflowException就是其中之一,因为据我所知,没有任何东西可以处理它。科林,事实上,关键点是控件何时离开。如果控件没有离开,那么finally块就不会执行!例如,try保护区域可能包含一个无限循环。@Eric:我完全从你的博客文章中了解到这个问题。我也没有考虑try/catch blockEnvironment中的无限循环;OutOfMemoryException和OutOfMemoryException都将避免运行Finally块。@neilwhitaker1:当这些事情发生时,控件真的离开Finally块了吗,还是干脆就死掉了?如果不先执行finally块,控制就不会进入finally块之外的任何地方,除非操作系统杀死或接管线程,并将“控制流”的概念抛到窗外,那该怎么说呢?