我有这个控制台应用程序(.NET Framework 4.5.2):
class Program
{
static void Main(string[] args)
{
using (var result = new Result())
{
result.Test();
}
}
}
public class Result : IDisposable
{
public void Test()
{
int a = 1;
int b = 1 / (a - 1);
}
public void Dispose()
{
Console.WriteLine("Dispose");
}
}
为什么不调用Dispose
方法?在Dispose
- 异常之后DivideByZero
未触发断点,并且控制台上没有输出(因为应用程序退出)。
答案 0 :(得分:7)
根据MS Docs:try-finally (C# Reference)
在处理的异常中,保证关联的finally块 要运行。但是,如果异常未处理,则执行 finally块取决于异常展开操作的方式 触发。反过来,这取决于您的计算机的设置方式。
由于您没有捕获DivideByZero
异常并且未处理,因此在您的计算机和设置上,它必须在运行任何其他代码行之前关闭应用程序,因此没有运行finally
块。
正如@Evk在下面的注释中指出的那样,如果我在没有附加调试器的情况下运行它,它会正确地展开异常并执行finally块。每天学习新东西。
根据Eric Lippert's answer to Finally Block Not Running?
想想这种情况有多糟糕:出乎意料的事情 碰巧没有人写过代码来处理。是对的 在那种情况下运行更多的代码,这可能也没有 建立处理这种情况?可能不是。通常是正确的事情 这里做的是不要尝试运行finally块,因为这样做 会让情况变得更糟。你已经知道这个过程了 下降;立刻摆脱痛苦。
在未处理的异常将取消的情况下 过程中,一切都会发生。它是实现定义的 在这种情况下发生:是否将错误报告给Windows错误 报告,调试器是否启动等等。 CLR是 完全在其试图运行finally块的权利之内,并且是 也完全在其快速失败的权利范围内。在这种情况下所有 投注已经结束;不同的实现可以选择做不同的 的东西。