我有以下代码:
class SampleClass : IDisposable
{
public void Dispose()
{
Console.WriteLine("Execute Dispose!");
}
}
static void Main(string[] args)
{
SampleClass sc = new SampleClass();
try
{
throw new Exception();
}
finally
{
sc.Dispose();
}
}
但是当我运行它时,它不会打印Execute Dispose!
消息,为什么会这样?
更新
如果我改变了代码:
static void Main(string[] args)
{
SampleClass sc = new SampleClass();
try
{
try
{
throw new Exception();
}
finally
{
sc.Dispose();
}
}
catch
{
throw;
}
}
首先打印消息然后崩溃。
我的想法是,如果应用程序崩溃,可以随意处置吗?
我知道这很简单,但我真的要了解更多。
答案 0 :(得分:11)
你有一个未处理的例外。 当您有未处理的异常时,程序行为依赖于实现。
正如您所发现的,在您的特定实现中,未处理的异常首先会询问您是否要调试未处理的异常(或在控制台上输出异常),然后然后< / em>运行finally块。
请注意,当存在未处理的异常时,无法保证finally块会运行。如果认为适合这样做,则允许实现在未处理的异常时立即终止该过程。
如果你不喜欢这种行为,那么你的选择是阻止或处理异常,或者获得运行时的不同实现,做你喜欢的事情更好。
答案 1 :(得分:10)
它会在窗口上打印Execute Dispose!
。你应该仔细观察。
答案 2 :(得分:5)
它在我的测试中执行(LinqPad)。
作为普通的控制台应用程序,消息出现在异常消息之后。
未处理的异常:System.Exception:'System.Exception'类型的异常 抛出。
在D:... \ Program中的OutputTest.Program.Main(String [] args) .cs:第27行 执行处理!
按任意键继续 。 。
但只有在你关闭“App已停止工作窗口”
时才会显示答案 3 :(得分:2)
确实打印出来了。也许说“应用程序已停止工作”的例外情况阻止您看到它。单击取消并查看打印的消息。
截图:
答案 4 :(得分:0)
就像其他人所说的那样,代码确实有效。您可能希望使用using
构造函数(如果类实现了IDisposable,则可以使用它)
class SampleClass : IDisposable {
public void Dispose() {
Console.WriteLine("Execute Dispose!");
}
}
static void Main(string[] args) {
using (SampleClass sc = new SampleClass()) {
throw new Exception();
}
}