有这么一段代码
static void Main(string[] args)
{
try { Console.WriteLine(1); throw new Exception(); }
catch(DivideByZeroException) { Console.WriteLine(2); }
finally { Console.WriteLine(3); }
Console.WriteLine(4);
}
正如您所看到的,这里产生了一些异常,它没有被 block 捕获catch,理论上它应该工作finally——因为它总是工作,不管是否有异常。但出于某种原因,它没有为我在控制台上显示数字 3。为什么会这样?
奇怪的是,这是预期的行为。文档说:
那是
在您的情况下,只是没有捕获到异常,因此中的代码
finally有权丢失。finally块不会执行的更多情况:StackOverflowExceptionAccessViolationException)可能会导致catch和被跳过finally。catch(或异常过滤器之一)可能永远不会完成,例如,进入无限循环或无限等待(死锁)。catch(或一个异常过滤器)中,可以使用Environment.FailFastor终止程序Environment.Exit。TerminateProcess。好吧,或者你自己的过程也是如此。catch。附录:似乎可以通过在整个程序周围
finally使用额外的try//块来强制在发生未处理的异常时执行块catch:throw(但我还没有在文档中找到对此的确认。)
此设置负责调试器中堆栈展开的行为: